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);
}