Отже, коли команда запускається з оболонки, fork () успадковує дочірній процес її, а exec () завантажує дочірній процес у пам'ять і виконує.
Не зовсім. fork()
клонує поточний процес, створюючи ідентичну дитину. exec()
завантажує нову програму в поточний процес, замінюючи існуючу.
Мій Q:
Якщо дочірній процес містить усі атрибути батьківського процесу (який є оригінальним процесом), то в чому ж полягає цей дочірній процес? Оригінальний процес також міг бути завантажений у пам'ять.
Необхідність полягає в тому, що батьківський процес ще не хоче закінчуватися; він хоче, щоб новий процес вийшов з ладу і зробив щось одночасно, що він продовжує виконувати також.
Чи застосовується ця концепція fork та exec для всієї виконуваної програми в UNIX? Як і для сценарію оболонки, або лише для команд? Чи застосовується це також для команд, вбудованих в оболонки?
Для зовнішніх команд оболонка робить fork()
так, що команда працює в новому процесі. Вбудовані просто управляються оболонкою безпосередньо. Ще одна помітна команда - це те exec
, що повідомляє оболонку exec()
зовнішній програмі без попереднього fork()
ing. Це означає, що сама оболонка замінена новою програмою, і тому її вже немає, до якої програма повертається, коли вона закривається. Якщо ви скажете, exec true
тоді /bin/true
ви заміните свою оболонку і негайно вийдете, не залишаючи більше нічого в своєму терміналі, тому він закриється.
коли використовується концепція копіювання при записі, якщо я виконую команду / сценарій?
Ще в кам'яну добу fork()
насправді довелося копіювати всю пам'ять у процесі виклику на новий процес. Копіювати на запис - це оптимізація, коли таблиці сторінок налаштовані так, що два процеси починають спільний доступ до однієї і тієї ж пам’яті, а при необхідності копіюються лише ті сторінки, які записуються будь-яким процесом.