Поиск по сайту:

Сила характера не в том, чтобы ломать других, а том, чтобы сломать себя! (Ю. Поляков).

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

2 мин для чтения
FavoriteLoadingДобавить в избранное
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (Пока оценок нет)
Загрузка...
29 апреля 2021
Статус выхода дочернего процесса в Linux
Известно, что системный вызов fork() используется для создания нового процесса, который становится потомком вызывающего процесса.
После выхода дочерний элемент оставляет статус выхода, который должен быть возвращен родителю. Итак, когда ребенок заканчивает, он становится зомби.

Каждый раз, когда дочерний элемент выходит или останавливается, родителю отправляется сигнал 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() ожидает только завершенных потомков, но это поведение можно изменить с помощью аргумента options, такого как WIFEXITED, WEXITSTATUS и т. д.

 

Значение pid может быть:

  • Меньше -1: означает ожидание любого дочернего процесса, идентификатор группы процессов которого равен абсолютному значению pid.
  • Равно -1: означает ожидание любого дочернего процесса.
  • Равно 0: означает ожидание любого дочернего процесса, идентификатор группы процессов которого совпадает с идентификатором вызывающего процесса.
  • Больше 0: означает ожидание дочернего процесса, идентификатор процесса которого равен значению pid.
  • WIFEXITED и WEXITSTATUS – это две опции, которые можно использовать для определения статуса выхода дочернего элемента.
  • WIFEXITED (статус): возвращает истину, если дочерний процесс завершился нормально.
  • WEXITSTATUS (статус): возвращает статус выхода дочернего элемента. Этот макрос следует использовать, только если WIFEXITED вернул истину.

Ниже представлена ​​реализация C, в которой дочерний элемент использует функцию execl(), но путь, указанный для execl(), не определен.
Давайте посмотрим, каково значение статуса выхода дочернего элемента, который получает родитель.

// Код C для определения состояния выхода дочернего процесса
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

// Код драйвера
int main(void)
{
pid_t pid = fork();

if ( pid == 0 )
{
/* Путь к файлу, переданному execl() не определен */
execl("/bin/sh", "bin/sh", "-c", "./nopath", "NULL");
}

int status;

waitpid(pid, &status, 0);

if ( WIFEXITED(status) )
{
int exit_status = WEXITSTATUS(status);
printf("Статус выхода дочернего процесса был %d\n", exit_status);
}
return 0;
}
exit:

 

Примечание
Приведенный выше код может не работать с онлайн-компилятором, так как fork() отключен.

 

Читать  В чем разница между wget и curl?

Здесь статус выхода 127, что указывает на некоторую проблему с путем или опечатку.

Несколько кодов статуса выхода перечислены ниже для получения дополнительной информации:

  • 1: Прочие ошибки, такие как «делить на ноль» и другие недопустимые операции.
  • 2: Отсутствует ключевое слово или команда, либо проблема с разрешением.
  • 126: проблема с правами доступа или команда не является исполняемым файлом
  • 128: недопустимый аргумент для выхода.

 

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

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Поделиться в соц. сетях:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии

Читайте также

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
()
x

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам:

Заполните форму и наш менеджер перезвонит Вам в самое ближайшее время!

badge
Обратный звонок 1
Отправить
galka

Спасибо! Ваша заявка принята

close
galka

Спасибо! Ваша заявка принята

close