Dlaczego niektóre programy wracają do powłoki natychmiast, a inne nie do momentu zakończenia wykonywania?

13

Przeczytałem z książki Nowoczesne systemy operacyjne, że po uruchomieniu polecenia powłoka tworzy proces potomny, czeka na niego, aż dziecko zakończy wykonywanie, a następnie czeka na kolejne polecenie od użytkownika. Tak jest w przypadku wielu takich programów gedit. Terminal nie przyjmuje poleceń, dopóki się nie zamknę gedit. Jednak gdy otwieram edytor kodu atomu , powłoka natychmiast wraca, gotowa zaakceptować następne polecenie nawet przy uruchomionym edytorze. Zamknięcie terminala nie zamyka atomu. Czy to oznacza, że ​​edytor nie otworzył się jako proces potomny? Jaki jest podstawowy mechanizm, który umożliwia to?

Bieganie ps au | grep atomdaje

<username>      8042  0.0  0.0  15944  2264 pts/1    S+   00:55   0:00 grep --color=auto atom
Aswin PJ
źródło
1
Czy po uruchomieniu edytora atomów możesz uruchomić ps au | grep atomterminal i dodać wynik do swojego pytania?
kirill-a
@ kirill-a Zaktualizowałem pytanie.
Aswin PJ,

Odpowiedzi:

18

Pytanie dotyczy dwóch rodzajów programów:

  1. programy, które współdziałają z użytkownikiem w powłoce, oraz
  2. programy, które nie współpracują z użytkownikiem w powłoce.

W pierwszym przypadku programy, które wchodzą w interakcję z użytkownikiem w powłoce, są zaprojektowane do działania do końca przed przywróceniem kontroli w powłoce. Nic specjalnego się nie dzieje.

Drugi przypadek jest bardziej skomplikowany. Zazwyczaj program rozwidla się (tworząc kopię siebie w pamięci) i aranżuje usunięcie powiązania z terminalem sterującym powłoki i może uruchomić inny program - który działa niezależnie od oryginalnej powłoki. Możesz zobaczyć wiadomości z drugiego programu, ale zwykle nie wchodzi on w interakcje z tobą. W zależności od tego, jak jest używany, możesz mieć

  • proces demona (serwera) lub
  • program może działać w nowym oknie. Redaktorzy graficzni robią to drugie.

Dalsza lektura:

Thomas Dickey
źródło
Część dotycząca rozwidlania i odłączania się od terminala jest często wykonywana przez wywołanie daemonfunkcji bibliotecznej, która robi to wszystko.
kasperd 14.04.16
Aby uniknąć uzyskania terminalu sterującego, stosuje się podwójny widelec
jfs
Do obu komentarzy: funkcja nie jest w POSIX i jestem świadoma kontrolowania terminali, ale odpowiedź była krótka i prosta. Używam podwójnych wideł od późnych lat 80-tych.
Thomas Dickey,