25) Quale altra primitiva esiste per rendere bloccante/non bloccante o asincrona la socket?
Il funzionamento bloccante o non bloccante si ottiene anche con la primitiva fcntl, dedicata al controllo dei files aperti
rit=fcntl(fd,cmd,...argomenti...);
int rit,fd,cmd;
il valore di rit varia a seconda degli argomenti usati
fd è il file descriptor
cmd è il tipo di azione da svolgere
il numero e la natura degli argomenti dipende dal servizio richiesto
Per rendere asincrona la socket:
rit=fcntl(s,F_SETFL,flag);
a questo punto due alternative:
flag=O_NDELAY, socket asincrona. A seguito di ciò, le susseguenti chiamate read(), recv(), send(), write() senza successo immediato ritornano un valore 0, mentre in errno condizione EWOULDBLOCK
flag=O_SYNC, socket sincrona. A seguito di ciò, le susseguenti chiamate read(), recv(), send(), write() senza successo immediato ritornano con valore -1 e la condizione d'errore EAGAIN
I flags O_NDELAY ed O_SYNC assegnati da fcntl() hanno la precedenza su ioctl() (che invocano a loro volta)