Відомо, що fork() системний виклик використовується для створення нового процесу, який стає дочірнім процесом викликаючого.
Після виходу дитина залишає статус виходу, який має бути повернений до батьків. Отже, коли дитина закінчує, вона стає a зомбі .
Щоразу, коли дитина виходить або зупиняється, батькові надсилається a SIGCHLD сигнал.
Батьківський пристрій може використовувати системний виклик wait() або waitpid() разом із макросами WIFEXITED і WEXITSTATUS разом з ним, щоб дізнатися про статус свого зупиненого дочірнього елемента.
Системний виклик (*)wait(): Він призупиняє виконання процесу виклику, доки один із його нащадків не завершиться.
Синтаксис системного виклику wait():
pid_t wait(int *status);
(*) Системний виклик waitpid(): призупиняє виконання процесу виклику, доки дочірній елемент, указаний аргументом pid, не змінить стан.
Синтаксис системного виклику waitpid():
pid_t waitpid(pid_t pid int *status int options)
Примітка. За замовчуванням waitpid() очікує лише завершених дітей, але цю поведінку можна змінити за допомогою аргументу параметрів, наприклад WIFEXITED WEXITSTATUS тощо.
Значення pid може бути:
- Менше ніж -1: означає очікування будь-якого дочірнього процесу, ідентифікатор групи процесів якого дорівнює абсолютному значенню pid.
- Дорівнює -1 : означає очікування будь-якого дочірнього процесу.
- Дорівнює 0: означає очікування будь-якого дочірнього процесу, ідентифікатор групи процесів якого дорівнює ідентифікатору процесу, що викликає.
- Більше 0: означає очікування дочірнього процесу, ідентифікатор процесу якого дорівнює значенню pid.
WIFEXITED і WEXITSTATUS — це два параметри, які можна використовувати, щоб дізнатися статус виходу дитини.
WIFEXITED(status) : повертає істину, якщо дочірній елемент закінчився нормально.
WEXITSTATUS(статус): повертає статус виходу дочірнього елемента. Цей макрос слід використовувати, лише якщо WIFEXITED повертає значення true.
Нижче наведено реалізацію C, у якій використовується дитина excl() але шлях, указаний для execl(), не визначений.
Давайте подивимося, яке значення статусу виходу отримує дочірній елемент.
// C code to find the exit status of child process #include #include #include #include #include // Driver code int main(void) { pid_t pid = fork(); if ( pid == 0 ) { /* The pathname of the file passed to execl() is not defined */ execl('/bin/sh' 'bin/sh' '-c' './nopath' NULL); } int status; waitpid(pid &status 0); if ( WIFEXITED(status) ) { int exit_status = WEXITSTATUS(status); printf('Exit status of the child was %dn' exit_status); } return 0; }
Вихід:

Примітка: Наведений вище код може не працювати з онлайн-компілятором, оскільки fork() вимкнено.
Тут статус виходу становить 127, що вказує на те, що є якась проблема з шляхом або є помилка.
Для додаткової інформації нижче наведено кілька кодів статусу виходу:
- 1 : різні помилки, такі як «поділити на нуль» та інші неприпустимі операції.
-
2: Відсутнє ключове слово, команда або проблема з дозволом. - 126: Проблема з дозволом або команда не є виконуваним файлом
- 128 : недійсний аргумент для виходу.
Примітка: стандарт C не визначає значення кодів повернення. Правила використання кодів повернення відрізняються на різних платформах.