A STREAMS rendszert a rá vonatkozó ioctl hívásokkal
vezérelhetjük. Ennek prototípusa a következo :
int ioctl(int fd,int command,arg);
Itt fd egy nyitott STREAMS driverre vonatkozó filedeszkriptor. A
command paraméter tartalmazza a végrehajtandó muvelet kódját, és
ettol függ az arg paraméter értéke. A rendszerhívás során
fellépett hibákat (ha az üzenetet nem tudta átadni a stream-fej
mögött levo modulnak) a szokásos módon jelzi. (Lásd errol részletesebben
a STREAMIO leírást az egyes hibaüzenetekrol!) Az ioctl hívás után
az errno változó értéke EINVAL lesz, és a hívás nem hajtódik
végre, ha az fd által specifikált stream már hozzá van kapcsolva
egy multiplexer driverhez (ld. késobb), vagy a command paraméter
tartalma nem egy jó STREAMS parancs-érték.
A következokben a leggyakrabban használt STREAMS ioctl parancsok lesznek ismertetve :
I_PUSH
: Befuz egy modult közvetlenül az fd által
megadott stream stream-feje alá. Az arg paraméter a befuzendo
modul nevére mutató karakter-pointer. Ezután meghívódik a befuzött modul
open (megnyitó) rutinja. Hiba esetén az errno változó lehetséges
értékei :
I_POP
: Leszedi a megadott stream tetején levo modult. A
hívásban arg értéke 0 kell legyen. Hiba esetén az errno
változó lehetséges értékei :
I_STR
: Egy STREAMS M_IOCTL
(ha szükséges, akkor
utána még egy M_DATA
) üzenetet generál az alapján, amire az
arg paraméter mutat, és elküldi a lefelé meno streamen. A felhasználó
így küldhet ioctl hívásokat a moduloknak és a drivereknek. A
rendszer vár addig, amíg az üzenetet feldolgozó modul visszajelzést ad
arról, hogy sikeres volt-e az ioctl hívás. Ha egy megadott idon
(default=15 sec.) belül nem érkezik visszajelzés, akkor az ioctl hívás
timeout hibával megszakad. Az arg paraméter egy strioctl
strukturára mutat. Ez tartalmazza a következo mezoket :
int ic_cmd; /* Milyen ugyben kuldjuk ezt ? */ int ic_timout; /* Mennyi ido mulva lesz timeout ? */ int ic_len; /* A lekuldendo adatterulet hossza */ char *ic_dp; /* Pointer az elkuldendo adatteruletre */Az egyes mezok jelentése a következo :
ic_cmd
: A driver (vagy modul) ez alapján tudja meg, hogy
mit kell csinálnia.
ic_timout
: Megadja, hogy maximum mennyi ideig kell
várakozni a modul (vagy driver) válaszára, vagyis mennyi ido múlva
következzen be a timeout. Ennek értékei a következok lehetnek :
-1
: végtelen sokáig kell várni.
0
: a rendszerben defaultnak számító ideig kell várni.
>0
: a paraméterben megadott ideig kell várakozni a
válaszra.
ic_len
: Az ioctl hívás elott megadja, hogy milyen hosszú
a streamen leküldendo ioctl-hez kapcsolódó adat hossza. Az ioctl hívás
után a driver (ill. modul) által felküldött válasz hosszát
tartalmazza (byteokban mérve).
ic_dp
: Arra az adatterületre mutat, ahol a streamen
leküldendo információ van. A hívás befejezodésekor ide fogja a rendszer
beírni az üzenetet feldolgozó modul által visszaküldött választ, így e
terület nagysága legalább akkora legyen, mint a visszaküldheto
leghosszabb válasz nagysága.
ic_dp
)
által meghatározott memóriaterület a process memóriatartományán kívül
esik.
ic_len
által megadott hossz nem
esik az adott rendszeren megengedett tartományba, vagy a
ic_timout
értéke -1-nél kisebb.
ic_timout
paraméterben
megadott idon belül nem kapott választ, a hívás timeout miatt
befejezodik.