Коли самостійно викликати fork () та exec ()?


9

Я дізнаюся про команди fork () та exec (). Схоже, fork () і exec () зазвичай називаються разом. (fork () створює новий дочірній процес, а exec () замінює поточне зображення процесу новим.) Однак у яких сценаріях ви можете викликати кожну функцію самостійно? Чи є такі сценарії?


2
Традиційний форкбомб: while (1) fork (); пришпилити системні ресурси.
Джошуа

Відповіді:


22

Звичайно! Поширений зразок у програмах "обгортки" полягає в тому, щоб робити різні речі, а потім замінити себе на якусь іншу програму лише з execвикликом (без вилки)

#!/bin/sh
export BLAH_API_KEY=blub
...
exec /the/thus/wrapped/program "$@"

Приклад цього в реальному житті є GIT_SSH(хоча git(1)він також пропонує, GIT_SSH_COMMANDякщо ви не хочете виконувати описаний вище метод програм обгортки).

Форкель використовується лише для нерестування типово робочих процесів (наприклад, Apache httpdв режимі fork (хоча лише fork - це краще підходить процесам, які потребують спалювання процесора, а не тих, які закручують великі пальці, очікуючи, що відбудеться мережевий ввід / вивід) ) або для розмежування привілеїв, які використовуються sshdта іншими програмами на OpenBSD (без виконання)

$ doas pkg_add pstree
...
$ pstree | grep sshd
 |-+= 70995 root /usr/sbin/sshd
 | \-+= 28571 root sshd: jhqdoe [priv] (sshd)
 |   \-+- 14625 jhqdoe sshd: jhqdoe@ttyp6 (sshd)

rootSSHD має на клієнті підключення з відокремився копія себе (28571) , а потім ще одну копії (14625) для поділу привілеїв.


14

Є багато.

Програми , які вимагають fork()без exec()зазвичай такі зразок породжуючи дитина робочих процесів для виконання різних завдань в окремих процесах на основний. Ви знайдете це в програмах настільки ж різноманітні , як dhclient, php-fpmі urxvtd.

Програма, яка дзвонить exec()без, fork()- це ланцюгова завантаження , перекриваючи її процес іншим зображенням програми. Існує ціла субкультура утилітів завантаження ланцюгів, які роблять конкретні речі для обробки стану, а потім виконують іншу програму для запуску з цим переглянутим станом процесу. Такі утиліти поширені в наборі інструментів для обслуговування та управління системою daemontools , але не обмежуються ними. Кілька прикладів:

У наборах інструментів сімейства daemontools є багато таких інструментів, від machineenvнаскрізних find-matching-jvmдо runtool.


2

Окрім інших відповідей, налагоджувачі, використовуючи ptrace, як правило, використовують розрив між forkта exec. Налагоджувач повинен позначати себе, PTRACE_TRACEMEщоб вказати, що він простежується за його батьківським процесом - налагоджувачем. Це для надання потрібних дозволів налагоджувачу.

Тож налагоджувач спочатку розщедрився б. Дитина буде дзвонити ptraceз , PTRACE_TRACEMEа потім подзвонити exec. Незалежно від програми, яку виконує дитина, тепер батько відстежує.


Існує багато прикладів того, як робити речі між fork та exec, найпоширенішим є перенаправлення вводу / виводу (наприклад, налаштування труб). Але питання полягає в тому, щоб зробити вилку без будь-якого виконання.
Barmar

0

exec без виделки

Є, щонайменше, дві причини, чому ви хочете зробити таке:

  1. Завантаження ланцюга Поточне зображення процесу замінено чимось іншим.
  2. Перезапуск поточно запущеної програми (може, наприклад, статися під час SIGHUP або такого серверного процесу, перезавантажуючи все і виконуючи абсолютно новий старт). Якимось чином можна стверджувати, що це завантаження ланцюга, лише збігаючись з тією ж програмою.

виделка без exec

Ось що робить кожен демон щоразу, коли він починається (справді двічі). Це робить декілька речей, серед яких оболонка не висить (оскільки початковий процес, який оболонка чекає на завершенні), і демон більше не контролюється терміналом, тому закриття вікна оболонки не вбиває демона.

Ще одне поширене використання - це розгалуження дітей-робітників, про які прославився веб-сервер apache близько 25 років тому (нині це вже не вважається сучасним через те, що він дуже схильний до громозахисної проблеми стада, але це, безумовно, забезпечує чорт простіший, можливий найнадійніший сервер).

Ще одне поширене використання - це створення послідовного знімка. forkне тільки створює процес, він також копіює (теоретично, насправді він лише позначає сторінки копіювати-записувати) адресний простір. Це (атомно) створює знімок повних програмних даних, які батько більше не може змінювати.
Деякі програми цим користуються. Наприклад, redis зберігає дані на диску (у послідовному стані), одночасно змінюючи набір даних одночасно. Це працює лише тому, що forkстворено послідовний знімок, який не бачить модифікацій, внесених батьківським процесом.


На сьогоднішній день насправді дуже мало dæmons, при цьому більшість не робить це як стандарт або не використовувати звичайний режим. Це помилка роздрібнення, що призводить до невідповідності готовності та жахів , і є однією з помилок помилок джемонізації . Ця помилка, нарешті, широко не впадає у користь.
JdeBP
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.