23) Come viene implementato un gestore di socket asincrone?
La socket asincrona fa sì che il segnale SIGIO venga ricevuto ad ogni cambiamento di stato della socket (ad esempio un arrivo di dati). L’istruzione select può essere utilizzata per determinare quale condizione si sia verificata.
Si utilizza la primitiva ioctl che permette di intervenire su qualsiasi cosa che possa essere acceduta tramite un file descriptor (file, socket, device):
rit=ioctl(fd,request,...argomenti...);
int rit,fd,request;
rit ritorna 0 in caso di successo e -1 in caso di errore
s è il file descriptor
request è il tipo di servizio richiesto o attributo da assegnare
il numero e la natura degli argomenti dipende dal servizio richiesto
Per rendere asincrona la socket:
flag=1; rit=ioctl(s,FIOASYNC,&flag);
e per consegnare SIGIO ai processi giusti:
flag=???;rit=ioctl(s,FIOCSPGRP,&flag);
a questo punto due alternative:
flag=-getpid(), quindi negativo, fa sì che SIGIO venga consegnato al singolo processo
flag=getpid(), quindi positivo, fa sì che SIGIO venga consegnato a tutti i processi del process group
NOTA: SIGIO è ovviamente ignorato dai processi che non hanno definito un gestore del segnale.
FLAG<0: consegna di SIGIO al solo processo
FLAG>0: consegna di SIGIO a tutti i processi del gruppo