tl; dr; o processo Xvfb
define um manipulador de sinal para SIGINT
e sai quando recebe tal sinal, mas o processo sleep
não, então ele herda o "ignore" o estado para SIGINT
como foi definido pelo shell executando o script antes de executar o sleep
binário.
Quando um script de shell é executado, o controle de trabalho é desativado e os processos em segundo plano (aqueles iniciados com &
) são executados no mesmo grupo de processos, com SIGINT
e SIGQUIT
definido como SIG_IGN
(ignorado) e com seu stdin redirecionado de /dev/null
.
Isso é exigido pelo padrão :
If job control is disabled (see the description of set -m) when the shell executes an asynchronous list, the commands in the list shall inherit from the shell a signal action of ignored (SIG_IGN) for the SIGINT and SIGQUIT signals.
Se a disposição do sinal estiver definida como SIG_IGN
(ignorar), esse estado será herdado por meio de fork()
e execve()
:
Signals set to the default action (SIG_DFL) in the calling process image shall be set to the default action in the new process image. Except for SIGCHLD, signals set to be ignored (SIG_IGN) by the calling process image shall be set to be ignored by the new process image.