logo

Status wyjścia procesu potomnego w systemie Linux

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ć: 
 



  1. Mniej niż -1: Oznacza oczekiwanie na dowolny proces potomny, którego identyfikator grupy procesów jest równy wartości bezwzględnej pid.
  2. Równe -1: Oznacza oczekiwanie na dowolny proces potomny.
  3. Równy 0: Oznacza oczekiwanie na dowolny proces potomny, którego identyfikator grupy procesów jest równy identyfikatorowi procesu wywołującego.
  4. 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
// 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: 
 

Status wyjścia procesu potomnego w systemie Linux
 

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.
 

Utwórz quiz