Wiadomo, że widelec() wywołanie systemowe służy do utworzenia nowego procesu, który staje się dzieckiem procesu wywołującego.
Po wyjściu dziecko pozostawia status wyjścia, który należy zwrócić rodzicowi. Kiedy więc dziecko skończy, staje się bałwan .
Za każdym razem, gdy dziecko wychodzi lub się zatrzymuje, rodzic zostaje wysłany: SIGCHLD sygnał.
Rodzic może użyć wywołania systemowego Wait() lub Waitpid() wraz z makrami WIFEXITED i WEXITSTATUS, aby dowiedzieć się o statusie swojego zatrzymanego dziecka.
Wywołanie systemowe (*)wait() : wstrzymuje wykonywanie procesu wywołującego do momentu zakończenia jednego z jego procesów potomnych.
Składnia wywołania systemowego Wait():
pid_t wait(int *status);
(*)Wywołanie systemowe waitpid(): Wstrzymuje wykonywanie procesu wywołującego do czasu, aż element potomny określony przez argument pid nie zmieni stanu.
Składnia wywołania systemowego waitpid() :
pid_t waitpid(pid_t pid int *status int options)
Uwaga: Domyślnie funkcja waitpid() czeka tylko na zakończone dzieci, ale to zachowanie można modyfikować za pomocą argumentu opcji, takiego jak WIFEXITED WEXITSTATUS itp.
Wartość pid może wynosić:
- Mniej niż -1: Oznacza oczekiwanie na dowolny proces potomny, którego identyfikator grupy procesów jest równy wartości bezwzględnej pid.
- Równe -1: Oznacza oczekiwanie na dowolny proces potomny.
- Równy 0: Oznacza oczekiwanie na dowolny proces potomny, którego identyfikator grupy procesów jest równy identyfikatorowi procesu wywołującego.
- Większe niż 0: Oznacza oczekiwanie na dziecko, którego identyfikator procesu jest równy wartości pid.
WIFEXITED i WEXITSTATUS to dwie z opcji, które można wykorzystać do poznania statusu wyjściowego dziecka.
WIFEXITED(status): zwraca wartość true, jeśli dziecko normalnie zakończyło pracę.
WEXITSTATUS(status): zwraca status wyjścia dziecka. To makro należy zastosować tylko wtedy, gdy WIFEXITED zwróciło wartość true.
Poniżej znajduje się implementacja C, w której dziecko używa excl() funkcja, ale ścieżka określona dla execl() jest niezdefiniowana.
Zobaczmy, jaka jest wartość statusu wyjścia dziecka, które otrzymuje rodzic.
// 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; }
Wyjście:

Notatka : Powyższy kod może nie działać z kompilatorem online, ponieważ funkcja fork() jest wyłączona.
Tutaj status wyjścia to 127, co wskazuje, że jest jakiś problem ze ścieżką lub jest literówka.
Poniżej wymieniono kilka kodów statusu wyjścia w celu uzyskania dodatkowych informacji:
- 1: Różne błędy, takie jak „dzielenie przez zero” i inne niedopuszczalne operacje.
-
2: Brak słowa kluczowego, polecenia lub problemu z uprawnieniami. - 126: Problem z uprawnieniami lub polecenie nie jest plikiem wykonywalnym
- 128: nieprawidłowy argument wyjścia.
Uwaga: Standard C nie definiuje znaczenia kodów zwrotnych. Zasady korzystania z kodów zwrotnych różnią się na różnych platformach.