2010-09-03 19 views
6

Mentre il processo sta eseguendo una chiamata di sistema di blocco, ad esempio di lettura o scrittura, il segnale è arrivato. La chiamata di sistema termina con l'errore EINTR? La chiamata di sistema viene riavviata dopo aver gestito la chiamata di sistema?Problema con gestione dei segnali, gestione degli interrupt

Supponiamo che la chiamata di sistema sia terminata con l'errore EINTR, il kernel gestisce il segnale prima di tornare allo spazio utente.

L'handle del segnale viene eseguito in modalità utente/modalità kernel? Se in modalità utente, ci sarà ritorno all'istruzione dopo la chiamata di sistema (lettura/scrittura) durante la quale il segnale è arrivato o ancora passa alla modalità kernel dopo aver gestito il segnale e ritorna all'utente da ret_from_syscall. Come riprende l'esecuzione nell'istruzione successiva alla chiamata di sistema durante la quale è arrivato il segnale?

È possibile riavviare il sistema passando il flag SA_RESTART in sigaction?

risposta

3

segnale viene eseguito dagli utenti modalità, ma con un diverso utente contesto, poi tornare al kernel, che tornare user_mode con ret_from_syscall. Il comportamento della chiamata di sistema quando il gestore di segnale è installato con SA_RESTART dipende dalla chiamata di sistema.

Una descrizione di cui chiamata di sistema vengono rinnovate è disponibile in versione recente di signal overview manpage:

man 7 signal 

Se non viene utilizzato il flag SA_RESTART, chiamata di sistema non è riavviato.

+1

Ora ho capito cosa intendi quando il segnale viene eseguito in modalità utente con un diverso contesto utente. Nel caso in cui il processo riceva un segnale, il processo passa alla modalità kernel per gestire l'eccezione in cui è impostata la maschera di bit dell'array di segnali del processo corrente. Appena prima di tornare in modalità utente, il kernel controlla il segnale in sospeso e chiama la funzione do_signal per gestire il segnale che a sua volta chiama handle_signal che copia il contesto hardware del kernel e modifica lo stack in modalità utente richiamando setup_frame. –

+0

Il nuovo frame dello stack contiene il signum, il valore del PC che punta al gestore del segnale in modalità utente, il campo dell'indirizzo di ritorno che contiene l'indirizzo della chiamata di sistema sigreturn. Durante il processo di ritorno in modalità utente, avvia l'esecuzione del gestore di segnale e al termine esegue sigreturn che fa passare il processo alla modalità kernel dove in contesto hardware dallo stack modalità utente viene copiato nello stack del kernel da restore_sigcontext (ripristino dello stack in modalità utente su stato originale). Quando la chiamata di sistema sigreturn termina, il processo torna alla modalità utente e continua da dove è rimasto prima del segnale. –

+0

È importante notare che SA_RESTART non si applica sempre. Alcune interfacce non vengono mai riavviate dopo essere state interrotte da un gestore di segnali, indipendentemente dall'uso di SA_RESTART; falliscono sempre con l'errore EINTR quando vengono interrotti da un gestore di segnale. Controlla [Pagina man di Signal per dettagli] (http://man7.org/linux/man-pages/man7/signal.7.html). – kikeenrique