Molte chiamate di sistema riporteranno EINTR
codice di errore se si è verificato un segnale mentre era in corso la chiamata di sistema. In realtà non si è verificato alcun errore, è solo segnalato in questo modo perché il sistema non è in grado di riprendere automaticamente la chiamata di sistema. Questo modello di codifica riprova semplicemente la chiamata di sistema quando ciò accade, per ignorare l'interrupt.
Ad esempio, questo potrebbe accadere se il programma fa uso di alarm()
per eseguire del codice in modo asincrono quando un timer si esaurisce. Se il timeout si verifica mentre il programma sta chiamando write()
, vogliamo solo riprovare la chiamata di sistema (ovvero lettura/scrittura, ecc.).
le risposte qui sono davvero buone e voglio aggiungere alcuni dettagli interni :
Le chiamate di sistema interrotte da segnali possono interrompere e restituire
EINTR
o riavviarsi automaticamente se e solo seSA_RESTART
è specificato insigaction(2)
e il responsabile di questo compito è il restart_block
che era solito tenere traccia delle informazioni e degli argomenti per riavviare le chiamate di sistema
Dalla pagina man su write
:
La chiamata è stata interrotta da un segnale prima della scrittura di qualsiasi dato