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)

 


Back
Index
Next