Pergunta

Como posso obter informações sobre o estado de um processo (ou seja, se ele é um zumbi) usando C sob Linux?

Depois de ler as respostas até agora eu quero estreitar minha pergunta um pouco: Eu preferiria uma solução C puro. Depois de ler a fonte ps (que lê / proc /) eu pensei que deve haver uma maneira melhor e perguntou aqui:)

Foi útil?

Solução

Você vai querer aprender sobre interagindo com o / proc / "pseudo-sistema de arquivos" via normal C chamadas de biblioteca padrão. A documentação necessária para começar é incluído com qualquer distro Linux e é uma pesquisa no Google simples de distância.

(Agora que você sabe o que procurar. Eu sei que é geralmente a maior parte do desafio!)

Em suma, os diretórios e arquivos dentro do / proc / diretórios de um sistema Linux em execução refletem o estado do kernel em execução, que (naturalmente) inclui processos. No entanto, antes de cobrar em que você precisa para manter algumas informações em mente.

Um processo zumbi não é a mesma coisa que um processo órfão. Um processo órfão é um processo saiu correndo em um estado de espera após pai o processo saiu incorretamente. Um processo zumbi é um processo que foi encerrado corretamente, lançou todos os seus recursos, mas é manter um lugar na tabela de processos.

Isso normalmente acontece quando um processo é iniciado por um programa. Você vê, o kernel não irá remover a entrada de um sub-processo acabado na tabela o processo até que o programa pai vai buscar corretamente o status de retorno do sub-processo. Isso faz sentido; De que outra forma o programa pai saber se o subprocesso saiu indevidamente?

Assim, todos os subprocessos são tecnicamente zumbis para, pelo menos, um tempo muito curto. Não é inerentemente mau estado para um programa para a.

Na verdade, "zumbis" são muitas vezes criados intencionalmente. Por exemplo, às vezes uma entrada de zumbi é deixado no local por um programa por um tempo para que os processos ainda lançados não terá o mesmo PID como o processo anteriormente lançado (e agora zumbi).

Em outras palavras, se você vai SIGCHLDing processos zombie desnecessariamente que você pode criar um problema sério para o programa de desova. No entanto, se um processo tem sido um zumbi para uma meia hora ou mais, é provavelmente um sinal de um bug.

Edit: A pergunta mudou em mim! Não, não há nenhuma maneira mais simples do que como ps faz. Se houvesse, teria sido integrados ps há muito tempo. Os arquivos / proc é o ser-tudo-end-all fonte de informação sobre o estado do kernel. :)

Outras dicas

Eu sei apenas duas maneiras:

  • saída de análise do comando ps
  • arquivos de Leitura em / proc / PID, onde PID é o identificador do processo (que é o que ps faz internamente)

Você quer que os processos em execução na sua máquina, em seguida, usar

$ ps aux

PS exibe informações sobre a seleção dos processos ativos. Se você quer uma atualização repetitiva da seleção e as informações exibidas, use top em seu lugar.

aqui :

Use this command to display all of your zombie processes:

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

Isto pode ser facilmente analisado usando C.

sistema de arquivos Pseudo / proc está descrevendo estruturas de dados internas do kernel e dá-lhe oportunidade para alterar alguns valores diretamente. A obtenção de estado de processo particular pode ser facilmente implementada com funções de I / O C. O arquivo direito de análise é: / proc / {PID} / status

comando abaixo podem ser usadas para obter processos em estado 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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top