Ü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.