Я искал, чтобы найти разницу между этими четырьмя в Google, и я ожидал, что там будет огромный объем информации об этом, но действительно не было никакого твердого сравнения между четырьмя вызовами.
Я приступил к попытке скомпилировать некий базовый взгляд на различия между этими системными вызовами, и вот что я получил. Является ли вся эта информация правильной/я не вижу ничего важного?
Fork
: вызов fork в основном делает дубликат текущего процесса, идентичный почти во всех отношениях (не все копируется, например, ограничения ресурсов в некоторых реализациях, но идея состоит в том, чтобы создать как закрытую копию, так и возможно).
Новый процесс (дочерний элемент) получает идентификатор процесса (PID) и имеет идентификатор PID старого процесса (родителя) в качестве родительского PID (PPID). Поскольку в двух процессах теперь выполняется точно такой же код, они могут определить, что из-за кода возврата fork - ребенок получает 0, родитель получает PID дочернего элемента. Это все, конечно, предполагается, что работает вызов fork - если нет, ни один дочерний элемент не создается, а родитель получает код ошибки.
Vfork
: Основное различие между vfork и fork заключается в том, что при создании нового процесса с помощью vfork() родительский процесс временно приостанавливается, а дочерний процесс может занять родительское адресное пространство. Это странное положение дел продолжается до тех пор, пока дочерний процесс не выйдет или не вызовет execve(), и в этот момент родительский
процесс продолжается.
Это означает, что дочерний процесс vfork() должен быть осторожным, чтобы избежать неожиданной модификации переменных родительского процесса. В частности, дочерний процесс не должен возвращаться из функции, содержащей вызов vfork(), и он не должен вызывать exit() (если ему нужно выйти, он должен использовать _exit(), на самом деле это также верно для дочернего нормального fork()).
Exec :
Вызов exec - это способ полностью заменить весь текущий процесс новой программой. Он загружает программу в текущее пространство процесса и запускает ее из точки входа. exec() заменяет текущий процесс на исполняемый файл, указанный функцией. Элемент управления никогда не возвращается к исходной программе, если нет ошибки exec().
Clone :
Клон, как fork, создает новый процесс. В отличие от fork эти вызовы позволяют дочернему процессу совместно использовать части контекста выполнения с вызывающим процессом, таким как пространство памяти, таблицу файловых дескрипторов и таблицу обработчиков сигналов.
Когда дочерний процесс создается с помощью клона, он выполняет приложение функции fn (arg). (Это отличается от fork, где выполнение продолжается в дочернем элементе с точки исходного вызова fork.) Аргумент fn является указателем на функцию, которая вызывается дочерним процессом в начале ее выполнения. Аргумент arg передается функции fn.
Когда приложение функции fn (arg) возвращается, дочерний процесс завершается. Целое число, возвращаемое fn, является кодом выхода для дочернего процесса. Детский процесс также может быть закончен явно, вызывая exit (2) или после получения фатального сигнала.
Полученная информация:
- Различия между fork и 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
Спасибо, что нашли время, чтобы прочитать это!:)