(Poste novamente no unix de acordo com a sugestão em link )
A pergunta curta é: o que um shell deve fazer se estiver em um grupo de processos órfão que não possui o tty? Mas eu recomendo ler a longa pergunta porque é divertido.
Aqui está uma maneira divertida e empolgante de transformar seu laptop em um aquecedor de ambiente portátil, usando seu shell favorito (a menos que você seja um desses estranhos tcsh):
#include <unistd.h>
int main(void) {
if (fork() == 0) {
execl("/bin/bash", "/bin/bash", NULL);
}
return 0;
}
Isso faz com que o bash ligue a CPU em 100%. zsh e fish fazem o mesmo, enquanto ksh e tcsh murmuram algo sobre o controle do job e depois chilam, o que é um pouco melhor, mas não muito. Ah, e é um infrator agnóstico de plataforma: OS X e Linux são afetados.
Minha explicação (potencialmente errada) é a seguinte: o shell filho detecta que não está em primeiro plano: tcgetpgrp(0) != getpgrp()
. Portanto, ele tenta parar por si mesmo: killpg(getpgrp(), SIGTTIN)
. Mas seu grupo de processos é órfão, porque seu pai (o programa C) era o líder e morreu, e SIGTTIN
enviado para um grupo de processos órfãos acabou de ser descartado (caso contrário, nada poderia iniciá-lo novamente). Portanto, o shell filho não é interrompido, mas ainda está em segundo plano, portanto, ele faz tudo novamente, imediatamente. Enxagúe e repita.
Minha pergunta é: como um shell de linha de comando pode detectar esse cenário e qual é a coisa certa a fazer? Eu tenho duas soluções, nenhuma das quais é ideal:
- Tente sinalizar o processo cujo pid corresponde ao nosso ID do grupo. Se isso falhar com
ESRCH
, isso significa que provavelmente somos órfãos.
- Experimente uma leitura sem bloqueio de um byte de
/dev/tty
. Se isso falhar com EIO
, isso significa que provavelmente somos órfãos.
(Nosso problema de rastreamento é link )
Obrigado por seus pensamentos!