#include <sys/types.h> #include <sys/stream.h> #include <sys/cmn_err.h> #include <sys/errno.h> #include <sys/sysmacros.h> #define NULL ((char *)(0)) extern nulldev(); static int lpbkwrite(), lpbkopen(), lpbkclose(), lpbkserv(); static struct module_info modinfo = /* A stream queue jellemzoit irja le */ { 0, /* Modulazonosito szam */ (char *)0, /* Modul neve */ 0, /* Minimalis message-meret */ INFPSZ, /* Maximalis message-meret */ 1024, 512 /* High; low water mark; 0=nincs ellenorzes */ }; static struct qinit lpbkwinit = /* "write" queue - lefele halado uzenetek queueja */ { putq, /* A message megy a service rutinnak */ lpbkserv, /* Service procedure */ lpbkopen, /* open-nel meghivott rutin */ lpbkclose, /* utolso close-nal lesz vegrehajtva */ nulldev, /* admin bejegyzes (csak a 3bnet-hez kell) */ &modinfo, /* Modulinformacios struktura */ NULL /* Statisztikakat tartalmazo tablazat */ }; static struct qinit lpbkrinit = /* "read" queue */ { nulldev, /* Message feldolgozasa */ lpbkserv, /* Service procedure */ lpbkopen, /* open-nel meghivott rutin */ lpbkclose, /* utolso close-nal meghivott rutin */ nulldev, /* admin bejegyzes */ &modinfo, /* Modulinformacios struktura */ NULL /* Statisztikakat tartalmazo tablazat cime */ }; struct streamtab lpbkinfo = /* A kernel ez alapjan tud tajekozodni a driverben */ { &lpbkrinit, /* Read queue-rol informaciok */ &lpbkwinit, /* Write queue-rol informaciok */ NULL, /* Multiplexer read queue */ NULL /* Multiplexer write queue */ };Itt érdemes megjegyezni azt, hogy ha a driver valamelyik queueja tartalmaz service rutint, és a put rutin azon a queuen nem csinálna semmit az üzenettel, csak továbbadná, akkor az ahhoz a sorhoz tartozó qinit strukturában put rutinként jegyezzük be a putq() kernel segédrutint. Itt kihasználtuk azt, hogy a putq() egy függvény, és nem makro, ezért a memóriabeli címére hivatkozhatunk.