Questa è una domanda successiva a Is a successful send() "atomic"?, poiché penso che in realtà riguardi le chiamate di sistema in generale, non solo le mandate sui socket.Quando e come vengono interrotte le chiamate di sistema?
Quali chiamate di sistema possono essere interrotte e quando si trovano, dove viene gestita l'interruzione? Ho imparato a conoscere SA_RESTART, ma non capisco esattamente cosa sta succedendo.
Se faccio una chiamata di sistema senza SA_RESTART, può la chiamata essere interrotta da qualsiasi tipo di interrupt (ad esempio, l'input dell'utente), che non riguardano la mia domanda, ma richiede il sistema operativo per interrompere la mia chiamata e fare qualcosa altro? Oppure è solo interrotto da segnali che riguardano direttamente il mio processo (CTRL + C, socket chiuso, ...)?
Quando si imposta SA_RESTART, quali sono le semantiche di un send() o qualsiasi altro syscall "lento"? Bloccherà sempre fino a quando tutti i miei dati non saranno trasmessi o il socket non funzionerà, oppure può tornare con un numero inferiore al conteggio nel parametro send()?
Dove viene eseguito il riavvio? Il sistema operativo sa che desidero riavviare la chiamata in caso di interruzioni o se qualche segnale viene inviato al mio processo e quindi gestito dal codice della libreria? O devo farlo da solo, ad es. avvolgere la chiamata in un ciclo while e riprovare tutte le volte necessarie?
Significa solo segnali inviati al mio processo, giusto? In qualche modo ho pensato che QUALSIASI interruzione del kernel che gestiva il mio interrupt (una pressione di un tasto, un movimento del mouse, un interrupt del timer, ...) avrebbe causato il ritorno della mia chiamata e il segnale da inviare. Un interruttore di contesto durante la chiamata di sistema non dovrebbe interferire con il mio processo in alcun modo oltre al tempo, giusto? – lxgr
@lxgr, è corretto, il cambio di contesto non interrompe le chiamate di sistema. –