2013-04-02 14 views
5

Se un processo Linux è in attesa di I/O segnale (cioè è in SLEEP stato) e un segnale SIGKILL viene emesso contro di esso, al momento della cessazione (STOPPED state) intende passare attraverso RUNNING o READY stato?SIGKILL movimentazione

In altre parole, per un processo che gestisce un interrupt di sistema come quello generato da SIGKILL è necessario passare attraverso lo stato RUNNING o READY?

Sapendo che in circostanze normali un processo in grado di gestire un interrupt dal kernel e sapendo che SIGKILL ha uno scopo del tutto contraddittorio di aver ucciso un segnale che non risponde, ero dubbioso su quanto il controllo è dato al processo di essere ucciso, se non del tutti.

+0

'SIGKILL' è un esempio sfortunato in quanto è un segnale che non può essere gestito dal processo di ricezione. Se la tua domanda non è correlata a 'SIGKILL' ed è un mero esempio, considera l'utilizzo di un altro segnale per esprimere ciò che intendi. – nemo

risposta

5

Il segnale viene "trasmesso" a un processo dal kernel, quindi l'invio di un segnale da processA a processB utilizza il kernel. Quando viene consegnato SIGKILL, il kernel non consente alcuna attività da parte del processo (modalità utente), in particolare il processo di elaborazione: chiamate atexit, _exit. Niente. Il processo viene semplicemente distrutto dal sistema. Ciò comporta alcune attività in modalità kernel. I dati bufferizzati sono persi. I semafori SYSV e altri oggetti di memoria persistenti del kernel sono rimasti in memoria. Può essere un vero casino.

Se qualcosa nella memoria del kernel sta causando un appendere si utilizza l'interfaccia sysrq in linux:

http://tldp.org/HOWTO/Remote-Serial-Console-HOWTO/security-sysrq.html

--to eseguire qualsiasi parvenza di una chiusura ordinata si può ottenere.

Ecco perché l'utilizzo di SIGKILL è un'assoluta risorsa, perché non puoi sapere cosa stai rompendo. E non risolverà tutti gli impiccagioni.

A cosa stai lavorando esattamente?

+0

Non penso che la domanda dell'OP fosse specifica di 'SIGKILL'. Lo capisco piuttosto come "un processo deve essere attivo per gestire un segnale". – nemo

+0

Un processo deve avere il contesto della CPU per ricevere i segnali. SIGKILL è leggermente diverso. I processi hanno due componenti: il kernel, a volte chiamato P0, il codice di accesso dell'utente, chiamato P1. P0 e P1 vengono semplicemente restituiti al pool non di paging del pool di paging e alla memoria di sistema quando SIGKILL viene prelevato dal kernel. Alcune cose come i semafori rimangono nella memoria del kernel. Quindi in questo senso P1 non diventa mai attivo. Sicuramente potresti sostenere che alcune attività di P0 sono nel contesto del processo, ma il tuo codice di modalità utente non può fare nulla al riguardo. –

+0

Sì, lo so e il tuo post dice già che 'SIGKILL' non può essere gestito. Ma non penso che l'OP chieda 'SIGKILL' ma tutti i segnali in generale. Quindi, la prima frase del tuo commento è la risposta alla domanda dell'OP IMO. – nemo