Estou um pouco confuso com a convenção na criação de daemons linux. A maioria das pessoas concorda que o que faz um daemon é nenhum terminal associado. Além disso, em códigos de exemplo, geralmente o pai do processo é eliminado e o daemon retorna ao init. Não tenho problemas em entender que essa é a maneira de fazer isso, MAS POR QUÊ? Como é benéfico que o processo não tenha um terminal associado e seja um filho direto do init?
https://en.wikipedia.org/wiki/SIGHUP
1. Qual a vantagem de o processo não ter um terminal associado?
Se bem entendi a situação, existem dois casos diferentes.
O caso óbvio é que , se você fechar, por exemplo, um emulador de terminal como o Terminal GNOME ou
mc
, isso fechará a extremidade mestre de um dispositivo pseudo-terminal. E esse fechamento gera um desligamento no pseudoterminal. Isso afeta o dispositivo escravo. Todos os processos que são controlados por este terminal receberão SIGHUP. Não é o caso descrito acima.@JDePB aponta o segundo caso: se você fechar todos os descritores de arquivo que fazem referência a um dispositivo terminal, também gerará um desligamento. Ou seja, se seu daemon fechar seu FD para seu tty (o que deveria), e posteriormente os outros processos que tiverem FDs abertos do tty saírem, seu daemon receberá SIGHUP, mesmo que seu emulador de terminal não responda e saia a extremidade mestre do pseudo-terminal aberta. Essa funcionalidade pode ser desativada para todo o dispositivo terminal desmarcando HUPCL .
Há também
vhangup()
. Parecelogin
que chama isso para tentar garantir que a sessão anterior não possa interferir nela. Ou alguma coisa. Não estou totalmente claro, já que esta chamada é específica do Linux e a página de manual é muito, muito curta.2. e é um filho direto para init?