Eu tenho um CD ao vivo que inicializa no Linux e executa um pequeno script Bash. O script procura e executa um segundo programa (que geralmente é um binário C ++ compilado).
Você deve abortar o segundo programa pressionando Ctrl+ C. O que deve acontecer é que o segundo programa seja interrompido e o script Bash continue executando a limpeza. O que realmente acontece é que o aplicativo principal e o script Bash são finalizados. O que é um problema.
Então eu usei o trap
built-in para dizer ao Bash para ignorar o SIGINT. E agora Ctrl+ Cencerra o aplicativo C ++, mas o Bash continua sua execução. Ótimo.
Ah, sim ... Às vezes, o "segundo aplicativo" é outro script do Bash. E, nesse caso, Ctrl+ Cagora não faz nada .
Claramente, meu entendimento de como essas coisas funcionam está errado ... Como controle qual processo obtém o SIGINT quando o usuário pressiona Ctrl+ C? Eu quero direcionar esse sinal para apenas um processo específico .
set -m
. É um pouco mais limpo e simples do que usarsetsid
toda vez que você administra uma criança.Como mencionei no comentário a f01, você deve enviar o SIGTERM para o processo filho. Aqui estão alguns scripts que mostram como interceptar ^ C e enviar um sinal para um processo filho.
Primeiro, o pai.
traptest
E agora, a criança.
sleeploop
Se o traptest envia o SIGTERM, as coisas se comportam bem, mas se o traptest envia o SIGINT, o sleeploop nunca o vê.
Se o sleeploop interceptar o SIGTERM e o modo de suspensão estiver em primeiro plano, ele não poderá responder ao sinal até que acorde da suspensão atual. Mas se o modo de suspensão for em segundo plano, ele responderá imediatamente.
fonte
No script inicial do bash.
acompanhar o PID do segundo programa
pegar o SIGINT
quando você pegar um SIGINT, envie um SIGINT para o segundo programa PID
fonte