Domanda

come posso ottenere informazioni sullo stato di un processo (cioè se è uno zombi) usando C sotto Linux?

Dopo aver letto le risposte finora voglio restringere un po 'la mia domanda: preferirei una soluzione C pura. Dopo aver letto la fonte ps (che legge / proc /) ho pensato che ci dovrebbe essere un modo migliore e ho chiesto qui :)

È stato utile?

Soluzione

Ti consigliamo di imparare a interagire con il / proc / " psuedo-filesystem " tramite chiamate di libreria standard C standard. La documentazione necessaria per iniziare è inclusa in qualsiasi distribuzione Linux ed è una semplice ricerca su Google.

(Ora che sai cosa cercare. So che di solito è la maggior parte della sfida!)

In breve, le directory e i file all'interno della directory / proc / di un sistema Linux in esecuzione riflettono lo stato del kernel in esecuzione, che (naturalmente) include i processi. Tuttavia, prima di caricare è necessario tenere a mente alcune informazioni.

Un processo di zombi non è la stessa cosa di un processo orfano. Un processo orfano è un processo lasciato in esecuzione in uno stato di attesa dopo la chiusura errata del padre del processo. Un processo di zombi è un processo che è uscito correttamente, ha rilasciato tutte le sue risorse, ma mantiene un posto nella tabella dei processi.

Questo in genere accade quando un processo viene avviato da un programma. Vedete, il kernel non rimuoverà la voce di un processo secondario terminato nella tabella dei processi fino a quando il programma padre non recupera correttamente lo stato di ritorno del processo secondario. Ciò ha senso; in quale altro modo il programma genitore potrebbe sapere se il sottoprocesso è uscito in modo improprio?

Quindi tutti i sottoprocessi sono tecnicamente zombi per almeno un tempo molto breve. Non è intrinsecamente uno stato negativo per un programma.

In effetti, "zombi" a volte vengono creati intenzionalmente. Ad esempio, a volte una voce di zombi viene lasciata in atto da un programma per un po 'in modo che ulteriori processi avviati non ottengano lo stesso PID del processo precedentemente lanciato (e ora zombi).

In altre parole, se vai SIGCHLDing inutilmente i processi di zombi potresti creare un grave problema per il programma di generazione. Tuttavia, se un processo è stato uno zombi per almeno mezz'ora, probabilmente è un segno di un bug.

Modifica: la domanda è cambiata su di me! No, non esiste un modo più semplice di come lo fa ps. Se ci fosse, sarebbe stato integrato in ps molto tempo fa. I file / proc sono la fonte di tutti i dati per informazioni sullo stato del kernel. :)

Altri suggerimenti

Conosco solo due modi:

  • Analisi dell'output del comando ps
  • Lettura dei file in / proc / PID, dove PID è l'identificatore del processo (questo è ciò che ps fa internamente)

Desideri che i processi siano in esecuzione sul tuo computer, quindi usa

$ ps aux

ps visualizza informazioni su una selezione dei processi attivi. Se desideri un aggiornamento ripetitivo della selezione e delle informazioni visualizzate, utilizza invece inizio .

Trovato qui :

Use this command to display all of your zombie processes:

ps aux | awk '{ print $8 " " $2 }' | grep -w Z

Questo può essere facilmente analizzato usando C.

Lo pseudo file system / proc sta descrivendo le strutture di dati interni del kernel e ti dà l'opportunità di modificare alcuni valori direttamente. Lo stato del processo particolare può essere facilmente implementato con le funzioni I / O C. Il file giusto da analizzare è: /proc/{PID}/status

Il comando seguente può essere utilizzato per ottenere processi nello stato Zombie.

for proc in $(echo /proc/[0-9]*);do if [[ $(sed -n '/^State:\tZ/p' ${proc}/status 2>/dev/null) ]];then basename $proc;fi;done
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top