next up previous contents
Next: A kernel segédrutinjai Up: Multiplexer driverek Previous: Multiplexer ioctl-ek

Input/Output események figyelése

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 : A visszatérési érték jelentése a következo :

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) :

Ha az arg paraméter értéke: 0, akkor a program ezután nem kap a kerneltol SIGPOLL signalokat. Hiba esetén az errno változó lehetséges értékei :

next up previous contents
Next: A kernel segédrutinjai Up: Multiplexer driverek Previous: Multiplexer ioctl-ek



Csizmazia Balazs
Tue Apr 2 00:06:27 MET DST 1996