Warum kehren einige Programme sofort zur Shell zurück, andere erst, wenn die Ausführung abgeschlossen ist?

13

Ich habe aus dem Buch Modern Operating Systems gelesen , dass die Shell beim Ausführen eines Befehls einen untergeordneten Prozess erstellt, darauf wartet, bis das untergeordnete Element die Ausführung abgeschlossen hat, und dann auf einen anderen Befehl vom Benutzer wartet. Dies ist in der Tat bei vielen Programmen wie z gedit. Das Terminal nimmt keine Befehle an, bis ich geschlossen habe gedit. Wenn ich jedoch den Atomcode -Editor öffne , kehrt die Shell sofort zurück und ist bereit, den nächsten Befehl zu akzeptieren, auch wenn der Editor ausgeführt wird. Durch Schließen des Terminals wird atom nicht geschlossen. Bedeutet dies, dass der Editor nicht als untergeordneter Prozess geöffnet wurde? Was ist der zugrunde liegende Mechanismus, der dies ermöglicht?

Laufen ps au | grep atomgibt

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom
Aswin PJ
quelle
1
Können Sie nach dem Starten des Atom-Editors ps au | grep atomim Terminal die Ausgabe Ihrer Frage hinzufügen?
Kirill-a
@ kirill-a Ich habe die Frage aktualisiert.
Aswin PJ

Antworten:

18

Die Frage betrifft zwei Arten von Programmen:

  1. Programme, die mit dem Benutzer in der Shell interagieren, und
  2. Programme, die nicht mit dem Benutzer in der Shell interagieren.

Im ersten Fall werden Programme, die mit dem Benutzer in der Shell interagieren, vollständig ausgeführt, bevor die Steuerung an die Shell zurückgegeben wird. Es wird nichts Besonderes getan.

Der zweite Fall ist komplizierter. Typischerweise wird das Programm Gabel (eine Kopie von mir in Erinnerung zu machen), und ordnet ihre Assoziation mit dem Shell entfernen Steueranschluss und kann ausgeführt werden, ein anderes Programm - die unabhängig von der ursprünglichen Schale verläuft. Möglicherweise sehen Sie Nachrichten aus dem zweiten Programm, aber normalerweise interagiert es nicht mit Ihnen. Je nachdem, wie es verwendet wird, können Sie haben

  • einen Daemon (Server) -Prozess oder
  • Das Programm wird möglicherweise in einem neuen Fenster ausgeführt. Grafische Editoren machen das letztere.

Weitere Lektüre:

Thomas Dickey
quelle
Der Teil über das Verzweigen und Trennen vom Terminal wird häufig durch Aufrufen der daemonBibliotheksfunktion ausgeführt, die all dies ausführt.
Kasperd
Um ein kontrollierendes Terminal zu vermeiden, wird Double Fork verwendet
jfs
Zu beiden Kommentaren: Die Funktion ist nicht in POSIX, und ich kenne die Steuerung von Terminals, habe aber die Antwort kurz und einfach gehalten. Ich habe seit den späten 1980er Jahren Doppelgabel verwendet.
Thomas Dickey