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
disownembutido 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.