Sempre achei que setsid()
e líderes de sessão tinham a ver com controle de processo e como a entrega de sinal com terminais funciona. Eles são um nível acima dos grupos de processos.
Uma resposta no Stackoverflow refere-se a POSIX.1-2008 , que diz:
3.339 Session
A collection of process groups established for job control purposes. Each process group is a member of a session. A process is considered to be a member of the session of which its process group is a member. A newly created process joins the session of its creator. A process can alter its session membership; see setsid(). There can be multiple process groups in the same session.
E Capítulo 11 prossegue, informando como os sinais são fornecidos com base nos grupos de processos e terminal de controle da sessão.
Na prática, todas as "sessões" logicamente separadas no sistema Linux que eu observei, são executadas em ID de sessão separada: s, então login
ou algum outro ( sshd
, screen
) executa setsid
como você sugeriu.
Quanto ao que um daemon deve fazer, suponho que dependa de qual sistema de init se usa. No Linux, com scripts de inicialização tradicionais do System V, o daemon precisa ir ao fundo em si (ou com a ajuda de um ajudante). Embora com o sysvinit, os scripts init podem ser executados diretamente do shell de um administrador, e isso pode não ser um ambiente limpo em todos os casos. (É possível herdar, por exemplo, limites de recursos da sessão.)
Em Upstart e Systemd, pode ser preferível que o daemon não se bifurque, já que o sistema init pode fazer isso. (E o Upstart em particular faz algumas coisas engraçadas para seguir os daemons de bifurcação.)
(Eu não sei sobre outros Unixes, mas como @Stephen Harris comentado , pode ser uma boa idéia para um programa daemon suportar tanto o comportamento de bifurcação quanto de não-bifurcação.)
Depois, há ssh-agent
, que geralmente é executado por um usuário sozinho, sem suporte do sistema init. É bastante útil que ele possa ser bifurcado para o fundo (com setsid
) e permanecer ativo, então ele pode ser usado a partir de múltiplos shells. ( screen
windows, xterm
s ...) Ele também tem uma saída útil quando é iniciado, então executá-lo com nohup
seria um pouco complicado.