Quando você fecha uma janela do Terminal do GNOME, o processo de shell (ou o processo de qualquer comando que você instrui o Terminal a executar) recebe o sinal SIGHUP. Um processo pode capturar SIGHUP, o que significa que uma função especificada é chamada, e a maioria das shells a captura. O Bash reagirá a um SIGHUP enviando SIGHUP para cada um de seus processos em segundo plano (exceto aqueles que foram rejeitados).
Olhando para o seu exemplo com gedit
(com alguma ajuda de pstree
e strace
):
Quando a janela do Terminal GNOME é fechada, o gedit é enviado SIGHUP pelo shell, e como ele não captura SIGHUP (e não o ignora), o gedit irá sair imediatamente.
─gnome-terminal(31486)─bash(31494)──gedit(31530) [31486] getpgid(0x7b06) = 31494 [31486] kill(-31494, SIGHUP) = 0 [31494] --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=31486, si_uid=0} --- [31494] kill(-31530, SIGHUP) = 0 [31530] --- SIGHUP {si_signo=SIGHUP, si_code=SI_USER, si_pid=31494, si_uid=0} --- [31530] +++ killed by SIGHUP +++ [31494] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=31530, si_status=SIGHUP} --- [31486] --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_KILLED, si_pid=31494, si_status=SIGHUP} ---
Mas quando você digita o comando gnome-terminal
e existe uma janela do Terminal GNOME, por padrão o Terminal GNOME fará algo um pouco incomum: ele chamará a fábrica org.gnome.Terminal.Factory
via D-Bus e sairá imediatamente; não há trabalho em segundo plano para o shell ver por mais de uma fração de segundo.
Como resultado da chamada de fábrica, a nova janela que você obtém depois de digitar gnome-terminal
é gerenciada por um novo thread do mesmo processo do Terminal GNOME que está gerenciando sua janela existente. Seu primeiro shell não tem conhecimento do id do processo do segundo shell e não pode matá-lo automaticamente.
─gnome-terminal(9063)─┬─bash(39548) │ └─bash(39651) ├─{gnome-terminal}(9068) └─{gnome-terminal}(9070)
Por outro lado, se você digitar gnome-terminal --disable-factory &
, ele não chamará a fábrica e, em termos de processo, ela se comportará como gedit
em seu exemplo.
─gnome-terminal(39817)──bash(39825)──gnome-terminal(39867)──bash(39874) │ ├─{gnome-terminal}(39868) │ └─{gnome-terminal}(39819)Fechar a primeira janela do terminal fechará as janelas do primeiro e do segundo terminal.