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

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

Запуск ps au | grep atom ps au | grep atom дает

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

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

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

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

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

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

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

  • Как работают fork и exec?
  • Зачем нам нужны вилки для создания новых процессов?
  • В чем разница между запуском программы в качестве демона и разворачиванием ее в фоновом режиме с помощью «&»?
  • fork () и exec () путаница