next up previous contents
Next: UDP broadcast lehetoség Up: A socketokkal kapcsolatos Previous: TCP sürgos adat

A socketokhoz kapcsolódó SIGIO és SIGURG signalok

Az eddigiekben csak a socketok "szinkron" módú kezelésérol volt szó (vagyis amikor a rendszerhívások csak azután fejezodnek be, miután az operációs rendszer a muveletet teljesen elvégezte). Lehetoség van bizonyos eseményeknek az "aszinkron" módú kezelésére is. Ezzel kapcsolatosak az operációs rendszer SIGIO és SIGURG nevu signaljai.

A rendszert "meg lehet kérni" a korábban már bemutatott signal() rendszerhívással, hogy olyan esetekben küldjön egy SIGIO signalt valamelyik folyamatnak, amikor valamelyik socketon (beolvasandó) adat érkezett. Hasonló módon kérheto a "sürgos adat érkezését" jelzo signal is. Ehhez eloször a signal() rendszerhívással a kívánt signal-handler eljárást ki kell jelölni, majd meg kell adni annak a folyamatnak az azonosítóját ( fcntl(socketdescriptor, F_SETOWN, procid) ) rendszerhívással, amelynek a signalt küldeni kell; és végül "engedélyezni" kell a signal-küldést egy ( fcntl(socketdescriptor, F_SETFL, FASYNC) ) rendszerhívással (vagyis ezzel azt mondjuk meg az operációs rendszernek, hogy a signal-handler "kész" a signalok fogadására).

Erre példa a következo programrészlet (itt mindkét signal-handlert kijelöltük, de ez nem "kötelezo" - a saját programunkba csak azt kell belerakni, amelyre szükségünk van).

     #include <fcntl.h>
     #include <signal.h>
     #include <errno.h>
     int iosignalhandler();
     int urgsignalhandler();

     int sd;

     ..

     sd = socket( ... );

     ..

     signal(SIGIO,iosignalhandler);
     signal(SIGURG,urgsignalhandler);

     if (fcntl(sd,F_SETOWN,getpid())<0) { /* Mi kapjuk a signalt */
          perror("hiba az 1. fcntl-nel");
          exit(1);
     }

     /* Ezutan  kapunk majd signalokat - ha valami erkezik */

     if (fcntl(sd,F_SETFL,FASYNC)<0) {
          perror("hiba a 2. fcntl-nel");
          exit(1);
     }



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