Perché alcuni programmi ritornano immediatamente alla shell mentre altri no fino al completamento dell'esecuzione?


13

Ho letto dal libro dei sistemi operativi moderni che quando un comando viene eseguito, la shell crea un processo figlio, lo attende fino a quando il bambino ha terminato l'esecuzione e quindi attende un altro comando dall'utente. Questo è davvero il caso di molti programmi come gedit. Il terminale non accetta comandi finché non ho chiuso gedit. Tuttavia, quando apro l' editor di codice atomico , la shell ritorna immediatamente, pronta ad accettare il comando successivo anche con l'editor in esecuzione. La chiusura del terminale non chiude l'atomo. Questo significa che l'editor non è stato aperto come processo figlio? Qual è il meccanismo sottostante che lo rende possibile?

Correre ps au | grep atom

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom

1
Dopo aver avviato l'editor Atom, è possibile eseguire ps au | grep atomnel terminale e aggiungere output alla domanda?
Kirill-a

@ kirill-a Ho aggiornato la domanda.
Aswin PJ

Risposte:


18

La domanda pone due tipi di programmi:

  1. programmi che interagiscono con l'utente nella shell e
  2. programmi che non interagiscono con l'utente nella shell.

Nel primo caso, i programmi che interagiscono con l'utente nella shell sono progettati per essere completati prima di restituire il controllo alla shell. Non viene fatto nulla di speciale.

Il secondo caso è più complicato. In genere il programma esegue il fork (eseguendo una copia di se stesso in memoria), e provvede a rimuovere la sua associazione con il terminale di controllo della shell e può eseguire un altro programma, che viene eseguito indipendentemente dalla shell originale. È possibile che vengano visualizzati messaggi dal secondo programma, ma in genere non interagisce altrimenti con l'utente. A seconda di come viene utilizzato, potresti averlo

  • un processo daemon (server) o
  • il programma può essere eseguito in una nuova finestra. Gli editor grafici fanno quest'ultimo.

Ulteriori letture:


La parte su biforcazione e dissociazione dal terminale viene spesso effettuata chiamando la daemonfunzione di libreria che fa tutto questo.
Kasperd,

Per evitare di ottenere un terminale di controllo, viene utilizzata la doppia forcella
jfs

Ad entrambi i commenti: la funzione non è in POSIX e sono a conoscenza del controllo dei terminali, ma la risposta è breve e semplice. Ho usato la doppia forcella dalla fine degli anni '80.
Thomas Dickey,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.