Üzeneteknek nevezzük a modulok láncán fel-le meno információkat,
hibaüzeneteket, stb. Egy üzenet (message) egy vagy több
üzenetblokkból áll. A STREAMS rendszerben egy üzenetblokk és az
adatblokkok felépítését a következo strukturák tartalmazzák :
struct msgb {
struct msgb *b_next; /* queue-n kovetkezo message */
struct msgb *b_prev; /* elozo message a queuen */
struct msgb *b_cont; /* tovabbi messageblokkok */
unsigned char *b_rptr; /* elso hasznos adatbyte*/
unsigned char *b_wptr; /* utolso hasznos byte utani adatbyte */
struct datab *b_datap; /* Adatblokkra pointer */
};
typedef struct msgb mblk_t;
struct datab {
struct datab *db_freep; /* Belso hasznalatra */
unsigned char *db_base; /* A buffer elso bytejara mutat */
unsigned char *db_lim; /* A buffer utolso utani byteja */
unsigned char db_ref; /* Hany uzenet mutat erre az adatra */
unsigned char db_type; /* Uzenettipus */
unsigned char db_class; /* Belso hasznalatra */
};
typedef struct datab dblk_t;
Megjegyzés: az egyes üzenetek nem biztos, hogy a teljes
adatblokkot lefoglalják. Azt, hogy egy üzenet értékes része az
adatblokkon belül hol kezdodik az üzenetblokknak a b_rptr
mezojébol tudható meg. Az üzenetblokk b_wptr mezoje pedig az
adatblokk utolsó értékes byteja utáni bytera mutat.
A STREAMS megengedi az üzenetek osztályozását. A különféle
üzenettípusokat felhasználva világosabb szerkezetu programokat írhatunk.
Ekkor a STREAMS szolgáltatást végzo rutin leggyakrabban csak egy
üzenettípusok szerinti elágazást tartalmaz, és egy-egy ág egy-egy
üzenettípus feldolgozásáért felelos. A STREAMS nagyon sokféle
üzenettípust ismer. Egy mblk_t *bp; módon deklarált üzenet
típusát a bp->b_datap->db_type kifejezés adja meg.
M_CTL : A STREAMS modulok egymás közti illetve driver és
modulok közti protokollinformációk tartoznak ebbe az üzenettípusba. A
felhasználói programok nem küldhetnek lefelé ilyen típusú üzeneteket,
mivel ezeket a stream-fej kiszuri.
M_DATA : Adatokat tartalmazó üzenetek. A felhasználó
ezeket a putmsg és write rendszerhívásokkal írhatja bele
egy streambe, és a getmsg és read rendszerhívásokkal
olvashatja ki a streambol.
M_DELAY : Ezzel az üzenettel kérheti valamelyik STREAMS
modul a drivertol az output késleltetett kiadását (például azért, mert
nagyon lassú az output periféria). Az üzenet formátuma nincs pontosabban
meghatározva, a programozó döntheti el, hogy hogyan akarja felhasználni.
A felhasználói programok nem küldhetnek lefelé ilyen üzeneteket, mivel
ezeket a stream-fej kiszuri.
M_IOCTL : A stream-fej a felhasználó ioctl hívásait
ilyen üzenet formájában továbbítja az alatta lévo modulokhoz. Az
ioctl-ben ekkor az I_STR parancsot kell megadni. Az a
modul, aki egy ilyen üzenetet feldolgozott, köteles ezt a stream-fej
irányába nyugtázni, mert a stream-fej addig nem továbbít üzeneteket,
amíg nem biztos benne, hogy az ioctl hívás hibátlanul lement.
M_PROTO : Protokoll-információkat a hozzá tartozó adatokkal
együtt tartalmazó üzenetek. A felhasználó ezeket putmsg
rendszerhívással írhatja a streambe, és getmsg rendszerhívással
olvashatja ki a streambol. Ezek az üzenetek nem kezelhetok
read/write hívással!.
M_PCPROTO : Szintén protokoll-információkat tartalmaz, de
magas a prioritása. A felhasználó ezeket putmsg
rendszerhívással írhatja a streambe, és getmsg rendszerhívással
olvashatja ki a streambol. Ezek az üzenetek nem kezelhetok
read/write hívással!. A normál (alacsony prioritású)
protokolladatoktól ezeket a létrehozásukkor egy flaggel
különböztethetjük meg a putmsg hívásban. A hívás szintaxisa:
putmsg(fd,ctlptr,dataptr,flags)
int fd;
struct strbuf *ctlptr;
struct strbuf *dataptr;
int flags;
Ha a flags paraméter RS_HIPRI-re van állítva, akkor
az üzenet magas prioritású üzenet lesz. (Egyébként a flags
paraméter értéke : 0.) Lásd errol részletesebben a UNIX
Programmer's Reference Manualt.
M_IOCACK és M_IOCNAK : Ezek az üzenetfajták az
ioctl hívások nyugtázására valók. Az M_IOCNAK üzenet egy
hibakódot visz magával a stream-fej irányába (csak hibakódot lehet így
a stream-fej irányába küldeni, válaszadatokat nem). A M_IOCACK
válaszadatokat is küldhet felfelé (ez a pozitív visszajelzés).
M_ERROR : Ezt az üzenetet a modulok vagy a driverek
küldhetik felfelé a stream-fej irányába, ha a lefele haladó queuen
valami hiba van. Ha ez az üzenet eléri a stream-fejet, akkor az ezután
kiadott rendszerhívások a close és a poll kivételével
hibával fejezodnek be, és a rendszer az üzenet elso bytejában megadott
hibakódot adja vissza az errno változóban hibakódként. A
poll rendszerhívás a POLLERR hibával tér vissza. Végül egy
M_FLUSH üzenet lesz a lefelé meno streamen elküldve.
M_SIG és M_PCSIG : Signalokat lehet a stream-fejen
keresztül bizonyos (például signalokra várakozó) folyamatoknak küldeni.
Az M_PCSIG a magas prioritású.
M_FLUSH : Egy streamen lévo modulok mindegyikét arra
utasítja, hogy a queue-jaikat ürítsék ki. Minden modulnak és drivernek
kezelnie kell ezt az üzenetet. (Erre megoldást jelent például a
kernel flushq() rutinjának a meghívása.) Ez egy magas prioritású
üzenet.