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.