Я пытался найти разницу между этими четырьмя в Google, и я ожидал, что по этому поводу будет огромное количество информации, но между четырьмя звонками действительно не было четкого сравнения.
Я попытался скомпилировать некий базовый взгляд на различия между этими системными вызовами и вот что я получил. Вся эта информация верна / я что-то упускаю?
Fork
Вызов fork в основном создает дубликаты текущего процесса, практически идентичные (не все копируются, например, из-за ограничений ресурсов в некоторых реализациях, но идея состоит в том, чтобы создать максимально близкую копию).
Новый процесс (дочерний) получает другой идентификатор процесса (PID) и имеет PID старого процесса (родителя) в качестве родительского PID (PPID). Поскольку два процесса теперь работают точно в одном и том же коде, они могут определить, какой именно, по коду возврата fork - дочерний элемент получает 0, родительский получает PID дочернего элемента. Конечно, это все, если предположить, что вызов fork работает - если нет, дочерний элемент не создается, а родительский код получает код ошибки.
Vfork
: Основное различие между vfork и fork заключается в том, что при создании нового процесса с помощью vfork () родительский процесс временно приостанавливается, и дочерний процесс может занимать адресное пространство родительского процесса. Это странное положение вещей продолжается до тех пор, пока дочерний процесс не завершится или не вызовет execve (), после чего родительский процесс продолжится.
Это означает, что дочерний процесс vfork () должен быть осторожен, чтобы избежать неожиданного изменения переменных родительского процесса. В частности, дочерний процесс не должен возвращаться из функции, содержащей вызов vfork (), и он не должен вызывать exit () (если ему нужно выйти, он должен использовать _exit (); на самом деле, это также верно для дочернего процесса нормальной вилки ()).
Exec :
Вызов exec - это способ в основном заменить весь текущий процесс новой программой. Он загружает программу в текущее пространство процесса и запускает ее из точки входа. exec () заменяет текущий процесс исполняемым файлом, указанным функцией. Элемент управления никогда не возвращается к исходной программе, если не существует ошибки exec ().
Clone :
Клон, как форк, создает новый процесс. В отличие от fork эти вызовы позволяют дочернему процессу совместно использовать часть своего контекста выполнения с вызывающим процессом, например пространство памяти, таблицу дескрипторов файлов и таблицу обработчиков сигналов.
Когда дочерний процесс создается с помощью clone, он выполняет функцию приложения fn (arg). (Это отличается от fork, где выполнение продолжается в дочернем элементе с точки исходного вызова fork.) Аргумент fn является указателем на функцию, которая вызывается дочерним процессом в начале его выполнения. Аргумент arg передается в функцию fn.
Когда возвращается функция функции fn (arg), дочерний процесс завершается. Целое число, возвращаемое fn, является кодом выхода для дочернего процесса. Дочерний процесс также может явно завершиться с помощью вызова exit (2) или после получения фатального сигнала.
Информация полученная форма:
- Различия между форком и exec
- http://www.allinterview.com/showanswers/59616.html
- http://www.unixguide.net/unix/programming/1.1.2.shtml
- http://linux.about.com/library/cmd/blcmdl2_clone.htm
Спасибо, что нашли время, чтобы прочитать это! :)
fork()
, как в Linux и, вероятно, во всех BSD), занимает адресное пространство своего родителя. Все, что он делает, кроме вызова execve()
или _exit()
, имеет большой потенциал, чтобы испортить родителя. В частности, обработчики exit()
вызовов atexit()
и другие «финализаторы», например: сбрасывает потоки stdio. Возвращение от vfork()
ребенка потенциально (то же самое предостережение, что и раньше) испортит стек родителя.
fork
системный вызов?