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