Por que alguns programas retornam ao shell imediatamente, enquanto outros não até a execução ser concluída?

13

Li no livro Sistemas operacionais modernos que, quando um comando é executado, o shell cria um processo filho, aguarda até que o filho termine a execução e aguarda outro comando do usuário. Este é realmente o caso de muitos programas como gedit. O terminal não aceita comandos até eu fechar gedit. No entanto, quando abro o editor de código atom , o shell retorna imediatamente, pronto para aceitar o próximo comando, mesmo com o editor em execução. Fechar o terminal não fecha o átomo. Isso significa que o editor não foi aberto como um processo filho? Qual é o mecanismo subjacente que torna isso possível?

Correr ps au | grep atom

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom
Aswin PJ
fonte
1
Após iniciar o editor atom, você pode executar o ps au | grep atomterminal e adicionar saída à sua pergunta?
precisa saber é o seguinte
@ kirill-a Atualizei a pergunta.
Aswin PJ

Respostas:

18

A pergunta pergunta sobre dois tipos de programas:

  1. programas que interagem com o usuário no shell e
  2. programas que não interagem com o usuário no shell.

No primeiro caso, os programas que interagem com o usuário no shell são projetados para serem executados até a conclusão antes de retornar o controle ao shell. Nada de especial é feito.

O segundo caso é mais complicado. Normalmente, o programa bifurca-se (fazendo uma cópia de si mesmo na memória) e providencia para remover sua associação com o terminal de controle do shell e pode executar outro programa - que é executado independentemente do shell original. Você pode ver mensagens do segundo programa, mas normalmente não interage com você. Dependendo de como é usado, você pode ter

  • um processo de daemon (servidor) ou
  • o programa pode ser executado em uma nova janela. Editores gráficos fazem o último.

Leitura adicional:

Thomas Dickey
fonte
A parte sobre bifurcação e desassociação do terminal geralmente é feita chamando a daemonfunção de biblioteca que faz tudo isso.
precisa saber é
Para evitar ficar um terminal, controlando garfo duplo é usado
JFS
Para ambos os comentários: a função não está no POSIX, e eu estou ciente de controlar terminais, mas mantive a resposta curta e simples. Eu uso garfo duplo desde o final dos anos 80.
Thomas Dickey