Existem várias maneiras de um processo ser morto por causa de um terminal que está morrendo.
-
A primeira maneira é que o driver de terminal no kernel envia um sinal SIGHUP para o processo de controle para o qual o terminal é o terminal de controle . Na maioria dos casos, o processo de controle é o shell que é inicialmente iniciado no terminal, e seu terminal de controle é aquele ao qual seus stdin, stdout e stderr estão conectados. Um processo se desconecta do terminal de controle se ele chamar
setsid
. -
A segunda maneira é que o shell, quando recebe SIGHUP, reenvia esse sinal para seus subprocessos - mais precisamente, para seus jobs em segundo plano. Algumas shells (ksh, bash, zsh) têm um
disown
embutido para dizer ao shell para não enviar um SIGHUP para um trabalho em particular. -
Se o terminal desaparecer e um programa tentar ler a partir dele, ele será notificado sobre uma condição de fim de arquivo (ou possivelmente EIO para um trabalho em segundo plano). Se o terminal desaparecer e um programa tentar gravar nele, a gravação retornará com um erro de EIO. Isso pode fazer com que o programa seja encerrado.
Então, o que su
muda aqui é que (2) normalmente faria com que o shell inicial matasse o job em segundo plano, mas como esse processo em segundo plano está sendo executado como um usuário diferente, o sinal não pode ser entregue e o processo em segundo plano em.