Прежде всего, каждый раз, когда вы выполняете команду, ваша оболочка будет форкать новый процесс, независимо от того, запускаете вы его &или нет. &только означает, что вы запускаете его в фоновом режиме.
Обратите внимание, это не очень точно. Некоторые команды, например, cdявляются функциями оболочки и обычно не будут создавать новый процесс. type cmdобычно скажет вам, cmdявляется ли это внешняя команда или функция оболочки. type typeговорит вам, что typeсама по себе является функцией оболочки.
nohupэто что-то другое. Это говорит новому процессу игнорировать SIGHUP. Это сигнал, посылаемый ядром, когда родительская оболочка закрыта.
Чтобы ответить на ваш вопрос, сделайте следующее:
- запустить
emacs & (по умолчанию должен запускаться в отдельном окне X) .
- на родительской оболочке запустите
exit.
Вы заметите, что emacsокно убито, несмотря на то, что работает в фоновом режиме. Это поведение по умолчанию и nohupиспользуется именно для его изменения.
Запуск задания в фоновом режиме (с &или bg, я уверен, другие оболочки также имеют другие синтаксисы) - это функция оболочки, проистекающая из способности современных систем работать в многозадачном режиме. Вместо того , чтобы разветвление нового экземпляра оболочки для каждой программы , которую вы хотите запустить, современные оболочек ( bash, zsh, ksh...) будет иметь возможность управлять списком программ (или заданий ). Только один из них одновременно может быть на переднем плане , то есть он получает фокус оболочки. Я хотел бы, чтобы кто-нибудь мог больше рассказать о различиях между процессом, выполняющимся на переднем плане, и процессом на заднем плане (основным из которых является доступ к stdin/stdout ).
В любом случае это не влияет на реакцию дочернего процесса SIGHUP. nohupделает.
nohupделает. Какую часть вы запутали?