Quais sinais relacionados ao terminal são enviados diretamente aos processos filhos do shell e quais sinais indiretamente via processo shell?

1

Se eu entendi a resposta de Gilles O que causa várias sinais a serem enviados? corretamente, existem vários sinais relacionados ao controle de trabalho por um processo shell em execução em um terminal:

    Notificações de pressionamento de teclas
  • : SIGINT, SIGQUIT, SIGTSTP

  • SIGSTOP, SIGCHLD, SIGCONT,

  • SIGTTIN e SIGTTOU

  • SIGWINCH e SIGHUP.

Eu queria saber quais sinais relacionados ao terminal são enviados para os processos-filho do shell diretamente, sem chegar ao processo do shell no terminal primeiro, e quais são enviados para o processo do shell no terminal primeiro e deixar o shell reenviar ao seu filho processos?

Por exemplo, para dois sinais mais usados, os itens a seguir estão corretos?

O SIGHUP é enviado primeiro para o processo de shell, que então o reenvia a todos os processos filhos do shell, estejam eles em primeiro ou segundo plano (isto é, quando nohup pode fazer a diferença).

Qual é o correto para o SIGINT ao pressionar Ctrl-C:

  • O driver de terminal envia SIGINT apenas para os processos no grupo de primeiro plano, mas não para o processo de shell pai em execução no terminal. então o processo shell do pai nunca precisa manipular o SIGINT.

  • O driver de terminal envia o SIGINT para o processo do shell em execução no terminal, e o processo do shell manipula o SIGINT ao reenviar o SIGINT para os processos no grupo de primeiro plano.

Se eu entendi a resposta de Stéphane Chazelas link corretamente, o primeiro está correto?

Obrigado!

    
por Tim 18.08.2017 / 17:28

1 resposta

2

Quando você executa um trabalho em primeiro plano em um shell interativo, somente os processos desse trabalho (no grupo de processos correspondente) recebem o SIGINT (enviado pelo kernel, não pelo shell) sobre ^C .

Quando não estiver executando nenhum trabalho em primeiro plano, ou seja, no prompt, quando o shell estiver aguardando sua entrada em uma linha de comando, o shell estará em primeiro plano¹. Portanto, pressionar ^C enviará um sinal SIGINT para o shell, que ele geralmente tratará como cancelando o texto inserido no momento; Ele também pode matar um comando chamado como parte de um widget chave ou de conclusão. Você também pode adicionar seu próprio manipulador lá.

Notas

¹ se o shell foi iniciado como parte do script também executando alguns outros comandos em paralelo, outros processos podem estar no mesmo grupo de processos. Os shells interativos tentarão criar um novo grupo de processos para si mesmos (e torná-lo o primeiro plano) na inicialização, mas poderão não conseguir se o processo já for um líder do grupo de processos. Se você fizer:

bash -c ': <(sleep 1000); exec bash'

E pressione Ctrl + C no prompt desse bash shell, você notará que sleep será morto também.

Em: sh -c 'sleep 1000 & exec bash' , sh ignoraria SIGINT para o comando sleep assíncrono (defina a disposição SIGINT como SIGIGN antes de executar sleep ).

    
por 18.08.2017 / 18:10