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
EINTRo 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