A STREAMS rendszer és a UNIX kernel lehetoséget ad több stream egyideju
figyelésére is (ez lényegében más operációs rendszerek polling
lehetoségeinek felel meg). Fontos ehhez egyrészt a poll
rendszerhívás, másrészt az I_SETSIG
STREAMS ioctl hívás.
--- - Szinkron I/O polling - ---
A poll rendszerhívás használatakor a programban meg kell adni a
figyelendo streamek filedeszkriptorjait, és azt, hogy milyen eseményre
kell várni, és mennyi ido múlva következzen be a timeout. A
rendszerhívás kiadása után a program futása leáll addig, amíg a
timeoutként megadott ido letelik vagy valamelyik kijelölt esemény
bekövetkezik.
Szintaxisa :
#include <stropts.h>
#include <poll.h>
int poll(fds,nfds,timeout)
struct pollfd fds[];
unsigned long nfds;
int timeout;
Az egyes paraméterek jelentése a következo :
int fd; /* Filedeszkriptor */ short events; /* Figyelendo esemenyek */ short revents; /* Eszlelt esemenyek */Az egyes mezok jelentése a következo :
A figyelésre kijelölheto illetve a visszajelzett események a következok közül kerülhetnek ki :
M_PCPROTO
) került a stream-fej
read queuejának az elejére. (A visszaadott események között ez és a
POLLPRI
egyszerre nem fordulhat elo.)
M_PCPROTO
) került a
stream-fej read queuejának az elejére.
POLLOUT
egyszerre nem fordulhat elo.)
M_ERROR
üzenettípus) érte el a stream-fejet.
0
,
akkor a rendszerhívás nem várakozik, csak megnézi, hogy van-e valami a
stream-fejeknél, ha pedig -1
, akkor nem lesz timeout, a
rendszerhívás tetszolegesen sokáig fog várni.)
0
: Timeout.
x>0
: A visszatérési érték : x egy pozitiv szám, és
megadja, hogy hány streamen történt valami. (Vagyis hány streamnek a
revents mezoje tartalmaz nullától különbözo értéket.)
-1
: Hiba történt. A hiba okáról az errno változóban
találunk információt. Ezek lehetnek a következok :
A következo program bemutatja a poll rendszerhívás használatát. A
program megnyit két streamet, az egyiket az Ethernet hálózati
driverhez,a másikat pedig az X.25 kontrollerhez, majd mindkét streamen
adatokra vár. Ha az egyik streamen adatot kap, akkor az ott bejövo
adatokat a másik streamen elküldi lefelé. A programban az open
rendszerhívásnál az O_NDELAY
flag azt jelzi, hogy ha a write
rendszerhívás nem tudja a szükséges mennyiségu adatot a drivernek
elküldeni, akkor a write ne blokkoljon. A példaprogramban ha a write
rendszerhívás nem tud minden adatot visszaírni, akkor a felhasználó
hibakezelo rutinja usrherr() lesz meghívva.
#include <fcntl.h>
#include <poll.h>
main()
{
struct pollfd pollfds[2];
char buf[1024];
int count, i;
if ((pollfds[0].fd = open("/dev/ethernet", O_RDWR | O_NDELAY)) < 0) {
perror("open /dev/ethernet sikertelen");
exit(1);
}
if ((pollfds[1].fd = open("/dev/x25", O_RDWR | O_NDELAY)) < 0) {
perror("open /dev/x25 sikertelen");
exit(2);
}
pollfds[0].events = POLLIN;
pollfds[1].events = POLLIN;
while (1) {
if (poll(pollfds, 2, -1) < 0) {
perror("poll rendszerhivas sikertelen");
exit(3);
}
for (i=0;i<2;i++) {
switch (pollfds[i].revents) {
case 0 : /* Semmi sem volt */
break;
case POLLIN : /* Adat erkezett, kuldjuk vissza */
while ((count = read(pollfds[i].fd, buf, 1024)) > 0)
if (write(pollfds[1-i].fd,buf,count) != count)
usrherr();
break;
default:
perror("Erre az esemenyre nem szamitottam!");
exit(4);
break;
} /* switch */
} /* for */
} /* while */
} /* main */
usrherr()
{
...
}
--- - Aszinkron I/O polling - ioctl - ---
A poll rendszerhívás mialatt egy eseményre vár, addig a
rendszerhívást kiadó program futása gyakorlatilag felfüggesztodik. Néha
ez nem megengedheto. Ekkor használhatjuk az I_SETSIG
STREAMS
ioctl rendszerhívást. Ez a hívás arra utasítja a kernelt, hogy ha adat
érkezik a megadott filedeszkriptorú stream stream-fejéhez, akkor
generáljon egy SIGPOLL
signalt.
A STREAMS ioctl harmadik paramétere (korábban ezt arg jelölte)
tartalmazza azokat az eseményeket, amelyek bekövetkezésekor signalt kell
generálni. Ez a bitmezo a következo értékek összerakásából állhat (az
összerakás itt a bitenkénti VAGY muveletet jelenti) :
S_INPUT
: Egy alacsony prioritású üzenet (nem
M_PCPROTO
) érkezett az addig üres read queuera.
S_HIPRI
: Egy magas prioritású üzenet (M_PCPROTO
)
érkezett a stream read queuejára.
S_OUTPUT
: A stream-fejtol lefelé induló write queue már
nincs tele - lehet rá adatokat írni.
S_MSG
: Olyan STREAMS üzenet érkezett a stream-fejhez,
amelynek az a feladata, hogy SIGPOLL
signált küldjön a
programnak.
0
, akkor a program ezután nem
kap a kerneltol SIGPOLL
signalokat. Hiba esetén az errno
változó lehetséges értékei :