Почему некоторые программы сразу возвращаются в оболочку, а другие нет, пока не завершится выполнение?

13

Я прочитал из книги « Современные операционные системы», что при запуске команды оболочка создает дочерний процесс, ждет его, пока дочерний процесс не завершит выполнение, а затем ожидает от пользователя другой команды. Это действительно так для многих программ, как gedit. Терминал не принимает команды, пока я не закрылся gedit. Однако, когда я открываю редактор кода атома , оболочка немедленно возвращается, готовая принять следующую команду, даже когда редактор работает. Закрытие терминала не закрывает атом. Значит ли это, что редактор открыт не как дочерний процесс? Каков основной механизм, который делает это возможным?

Бег 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
источник
1
После запуска редактора атомов, вы можете запустить ps au | grep atomв терминале и добавить вывод к вашему вопросу?
kirill-a
@ kirill-a Я обновил вопрос.
Aswin PJ

Ответы:

18

Вопрос задается о двух типах программ:

  1. программы, которые взаимодействуют с пользователем в оболочке, и
  2. программы, которые не взаимодействуют с пользователем в оболочке.

В первом случае программы, которые взаимодействуют с пользователем в оболочке, предназначены для полного завершения до возврата управления оболочке. Ничего особенного не сделано.

Второй случай более сложный. Обычно программа разветвляется (делает свою копию в памяти) и организует удаление своей связи с управляющим терминалом оболочки и может выполнить другую программу, которая работает независимо от исходной оболочки. Вы можете видеть сообщения от второй программы, но обычно она не взаимодействует с вами. В зависимости от того, как он используется, вы можете иметь

  • демон процесс (сервер), или
  • программа может работать в новом окне. Графические редакторы делают последнее.

Дальнейшее чтение:

Томас Дики
источник
Часть о разветвлении и отключении от терминала часто выполняется путем вызова daemonбиблиотечной функции, которая делает все это.
kasperd
Чтобы избежать получения управляющего терминала, используется двойная вилка
jfs
На оба комментария: функция отсутствует в POSIX, и я знаю об управлении терминалами, но оставил ответ коротким и простым. Я использовал двойную вилку с конца 1980-х годов.
Томас Дики