logo

Статус виходу дочірнього процесу в Linux

Відомо, що 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. Менше ніж -1: означає очікування будь-якого дочірнього процесу, ідентифікатор групи процесів якого дорівнює абсолютному значенню pid.
  2. Дорівнює -1 : означає очікування будь-якого дочірнього процесу.
  3. Дорівнює 0: означає очікування будь-якого дочірнього процесу, ідентифікатор групи процесів якого дорівнює ідентифікатору процесу, що викликає.
  4. Більше 0: означає очікування дочірнього процесу, ідентифікатор процесу якого дорівнює значенню pid.


WIFEXITED і WEXITSTATUS — це два параметри, які можна використовувати, щоб дізнатися статус виходу дитини. 
WIFEXITED(status) : повертає істину, якщо дочірній елемент закінчився нормально.
WEXITSTATUS(статус): повертає статус виходу дочірнього елемента. Цей макрос слід використовувати, лише якщо WIFEXITED повертає значення true.
Нижче наведено реалізацію C, у якій використовується дитина excl() але шлях, указаний для execl(), не визначений. 
Давайте подивимося, яке значення статусу виходу отримує дочірній елемент.

C
// 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; } 

Вихід: 
 

Статус виходу дочірнього процесу в Linux
 

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

  • 1 : різні помилки, такі як «поділити на нуль» та інші неприпустимі операції.

  • 2: Відсутнє ключове слово, команда або проблема з дозволом.
  • 126: Проблема з дозволом або команда не є виконуваним файлом
  • 128 : недійсний аргумент для виходу.


Примітка: стандарт C не визначає значення кодів повернення. Правила використання кодів повернення відрізняються на різних платформах.
 

Створіть вікторину