Я шукав, щоб знайти різницю між цими чотирма в Google, і я очікував, що там буде величезна кількість інформації, але насправді не було чіткого порівняння між чотирма дзвінками.
Я почав намагатися скласти якийсь базовий оглядовий погляд на відмінності між цими системними викликами, і ось що я отримав. Чи є вся ця інформація правильною / я пропускаю щось важливе?
Fork
: Виклик fork в основному створює дублікат поточного процесу, ідентичний практично в усіх відношеннях (не все копіюється, наприклад, обмеження ресурсів в деяких реалізаціях, але ідея полягає в тому, щоб створити максимально близьку копію).
Новий процес (дочірня) отримує інший ідентифікатор процесу (PID) і має PID старого процесу (батьківського) як його батьківський PID (PPID). Оскільки в двох процесах зараз працює абсолютно один і той же код, вони можуть сказати, що саме за кодом повернення fork - дитина отримує 0, батько отримує PID дитини. Це все, звичайно, якщо припустити, що виклик вилки працює - якщо ні, не створюється жодна дитина і батько отримує код помилки.
Vfork
: Основна відмінність vfork від fork полягає в тому, що коли новий процес створюється з vfork (), батьківський процес тимчасово призупиняється, і дочірній процес може зайняти адресний простір батьків. Цей дивний стан речей продовжується до тих пір, поки дочірній процес або не завершиться, або зателефонує execve (), і тоді батьківський процес триває.
Це означає, що дочірній процес vfork () повинен бути обережним, щоб уникнути несподіваних змін змінних батьківського процесу. Зокрема, дочірній процес не повинен повертатися з функції, що містить виклик vfork (), і він не повинен викликати exit () (якщо йому потрібно вийти, він повинен використовувати _exit (); власне, це також стосується дитини нормальної вилки ()).
Exec :
Виклик exec - це спосіб в основному замінити весь поточний процес новою програмою. Він завантажує програму в поточний простір процесу та запускає її з точки входу. exec () замінює поточний процес виконуваним функцією. Керування ніколи не повертається до початкової програми, якщо не виникає помилка exec ().
Clone :
Клон, як вилка, створює новий процес. На відміну від fork, ці виклики дозволяють дочірньому процесу ділитися частинами контексту його виконання з процесом виклику, таким як простір пам'яті, таблиця дескрипторів файлів та таблиця обробників сигналів.
Коли дочірній процес створюється з клоном, він виконує додаток функції fn (arg). (Це відрізняється від fork, де виконання у дитини продовжується від точки початкового виклику fork.) Аргумент fn - це вказівник на функцію, яка викликається дочірнім процесом на початку її виконання. Аргумент arg передається функції fn.
Коли програма fn (arg) функція повертається, дочірній процес припиняється. Ціле число, повернене fn, є вихідним кодом для дочірнього процесу. Дочірній процес може також явно закінчуватися, викликаючи вихід (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
Дякуємо, що знайшли час, щоб прочитати це! :)
fork()
, ніж це в Linux, і, ймовірно, всі BSD), він займає адресний простір свого батька. Все, що вона робить, крім дзвінків execve()
або _exit()
, має великий потенціал, щоб зіпсувати батьків. Зокрема, exit()
викликає atexit()
обробники та інші "фіналізатори", наприклад: він промиває потоки stdio. Повернення від vfork()
дитини потенційно (таке ж застереження, як і раніше) зіпсує батьківський стек.
fork
syscall?