Разницу между fork (), vfork (), exec () и clone ()

Я искал разницу между этими четырьмя в Google и ожидал, что там будет огромное количество информации по этому поводу, но достоверного сравнения между четырьмя звонками не было.

Я начал пытаться скомпилировать своего рода базовый обзор различий между этими системными вызовами, и вот что я получил. Правильна ли вся эта информация / пропущено ли что-нибудь важное?

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

Новый процесс (дочерний) получает другой идентификатор процесса (PID) и имеет PID старого процесса (родителя) в качестве родительского PID ( PPID). Поскольку два процесса теперь работают с одним и тем же кодом, они могут определить, какой из них есть, по коду возврата fork - дочерний процесс получает 0, родительский элемент получает PID дочернего элемента. Это все, конечно, при условии, что вызов fork работает - в противном случае дочерний процесс не создается и родительский элемент получает код ошибки.

Vfork : Основное различие между vfork и fork заключается в том, что когда создается новый процесс Созданный с помощью vfork (), родительский процесс временно приостанавливается, и дочерний процесс может заимствовать адресное пространство родителя. Это странное положение дел продолжается до тех пор, пока дочерний процесс не завершится или не вызовет execve (), после чего родительский процесс процесс продолжается.

Это означает, что дочерний процесс vfork () должен проявлять осторожность, чтобы избежать неожиданного изменения переменных родительского процесса. В частности, дочерний процесс не должен возвращаться из функции, содержащей вызов vfork (), и он не должен вызывать exit () (если ему нужно выйти, он должен использовать _exit (); на самом деле это также верно для дочернего обычной вилки ()).

Exec: Вызов exec - это способ в основном заменить весь текущий процесс новой программой. Он загружает программу в текущее пространство процесса и запускает ее из точки входа. exec () заменяет текущий процесс исполняемым файлом, на который указывает функция. Управление никогда не возвращается к исходной программе, если не возникает ошибки exec ().

Клонирование: Клонирование в качестве fork создает новый процесс. В отличие от вилки, эти вызовы позволяют дочернему процессу совместно использовать части своего контекста выполнения с вызывающим процессом, такие как пространство памяти, таблица дескрипторов файлов и таблица обработчиков сигналов.

Когда дочерний процесс создается с помощью clone, он выполняет приложение функции fn (arg). (Это отличается от fork, где выполнение продолжается в дочернем процессе с точки исходного вызова fork.) Аргумент fn представляет собой указатель на функцию, которая вызывается дочерним процессом в начале его выполнения. Аргумент arg передается функции fn.

Когда приложение-функция fn (arg) возвращается, дочерний процесс завершается. Целое число, возвращаемое функцией fn, является кодом выхода для дочернего процесса. Дочерний процесс также может завершиться явным образом, вызвав exit (2) или получив фатальный сигнал.

Информация получена из формы:

Спасибо, что нашли время прочитать это! :)

190
задан codeforester 6 September 2018 в 14:19
поделиться