Известно е, че вилица() системното повикване се използва за създаване на нов процес, който става дете на извикващия процес.
При излизане детето оставя статус на излизане, който трябва да бъде върнат на родителя. Така че, когато детето завърши, то става 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(статус) : връща истина, ако детето приключи нормално.
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 не дефинира значението на кодовете за връщане. Правилата за използване на кодове за връщане варират в различните платформи.