Depois de muitas horas de pesquisa na face da Internet, encontrei a resposta.
-
O Linux tem a noção de um grupo de processos .
-
O driver TTY possui uma noção do Grupo de processos de primeiro plano.
-
Quando você pressiona Ctrl + C, o TTY envia SIGINT para todos os processos no grupo de processos em primeiro plano. (Veja também esta entrada de blog .)
É por isso que tanto o binário compilado quanto o script que inicia ambos são corrompidos. Na verdade, eu só quero que o aplicativo principal receba esse sinal, não os scripts de inicialização.
A solução agora é óbvia: precisamos colocar o aplicativo em um novo grupo de processos e torná-lo o primeiro grupo de processos para este TTY. Aparentemente, o comando para fazer isso é
setsid -c <applcation>
E isso é tudo. Agora, quando o usuário pressiona Ctrl + C, SIGINT será enviado para o aplicativo (e qualquer criança que ele possa ter) e mais ninguém. Qual é o que eu queria.
-
setsid
por si só coloca o aplicativo em um novo grupo de processos (na verdade, uma nova "sessão" inteira, que aparentemente é um grupo de grupos de processos). -
A adição do sinal
-c
faz com que esse novo grupo de processos se torne o grupo de processos "primeiro plano" para o TTY atual. (Ou seja, fica SIGINT quando você pressiona Ctrl + C).
Eu vi muitas informações conflitantes sobre quando o Bash executa ou não os processos em um novo grupo de processos. (Em particular, parece ser diferente para shells "interativos" e "não-interativos".) Eu já vi sugestões de que você talvez consiga fazer isso funcionar com truque de cachimbo inteligente ... não sei. Mas a abordagem acima parece funcionar para mim.