Zumbi não é realmente relacionado aos outros; simplesmente é um processo que foi finalizado, mas seu processo pai ainda não leu seu status de saída com waitpid()
ou similar. Você não deve vê-los, a menos que um processo esteja com erros ou parado.
Um daemon é um programa que é executado sem um terminal de controle. Normalmente, quando você executa o programa, ele fork()s
próprio e o pai saem para que o shell pense que o comando foi concluído e o processo filho se desconecta do terminal e escapa da sessão de login. Desde a saída do processo pai, seu ID do processo pai se torna 1, que é tradicionalmente o init
programa ou atualmente systemd
. Esse processo garante a colheita de seus filhos quando eles morrem, para que você não seja invadido por zumbis.
Um processo pode ser associado a um terminal de controle , de onde ele normalmente recebe sua entrada e a envia para. O terminal também pode enviar sinais para processos conectados a ele e identifica um grupo de processos como o grupo em primeiro plano . Os processos que estão no grupo em primeiro plano têm permissão para ler as entradas do terminal e recebem os sinais SIGINT e SIGSUSP quando você pressiona Ctrl-C e Ctrl-Z. Qualquer processo que não esteja no grupo de primeiro plano que tenta ler do terminal é suspenso com o SIGTSTP.
O shell cria grupos de processos diferentes para cada um dos comandos de pipeline que você pede para executar, e muda qual deles é o grupo em primeiro plano para mover tarefas entre o primeiro e o segundo plano. Quando você executa um comando, normalmente o shell cria um novo grupo de processos e o grupo em primeiro plano . Se você o sufixar com um &
, o shell simplesmente deixará o grupo em primeiro plano onde estava e, portanto, o novo grupo ficará em segundo plano. Pressionar Ctrl-Z envia SIGSUSP ao grupo em primeiro plano, o que faz com que a maioria dos comandos seja suspensa, mas, em vez de suspender, o shell altera o grupo em primeiro plano ativo novamente para que ele possa solicitar um novo comando.
O bg
comando envia o SIGCONT a um grupo de processos para que ele possa retomar a execução em segundo plano após ter sido suspenso com o SIGSUSP. fg
altera o grupo em primeiro plano para um dos grupos existentes já em execução em segundo plano, trazendo-o para o primeiro plano.
fork()
tirar uma cópia de si mesmo, useexec()
nessa cópia para substituí-lo pelo que você deseja executar e usewait()
na instância original do programa (não na cópia executadaexec()
). No período muito curto de tempo entre o momento em que a criança sai e o momento emwait()
que colhe o status (removendo-o da tabela de processos e devolvendo-o ao chamador), você tem um zumbi.