The Linux wait function is detailed
Why wait and waitpid occur sigchld--when a child process exits, the kernel sigchld the signal to the parent process, and the child process exits with an asynchronous event (the child process can terminate at any time the parent process runs)-when the child process exits, the kernel leaves the child process in zombie state. This process becomes a zombie process that retains only the smallest number of kernel data structures so that the parent process queries the exit status of the child process-the exit state of the parent process query subprocess can be used with the Wait/waitpid function
Wait gets staus after the detection processing macro definition description wifexited (status) If the process child process ends normally, returns a non-0 value wexitstatus (status) if wifexited nonzero, Returns the child process exit code wifsignaled (status) child process terminates because of a capture signal, returns a non-0 value wtermsig (status) if wifsignaled nonzero, returns the signal Code wifstopped (status) If the process is paused, returns a non-0 value wstopsig (status) if wifstopped nonzero, returns the signal code
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/wait.h>int main (int Arg,char *args[]) {pid_t pid=fork ( ); if (pid==-1) {printf ("fork () failed! Error message:%s\n ", Strerror (errno)); return-1; } if (pid>0) {int status=0; printf ("Parent process \ n"); Wait (&status); If wifexited (status)//wifexited the definition of the macro: Wait if exit ed {printf ("Child process return info code:%d\n", Wexitstatus (status)); }else if (wifsignaled (status)) {printf ("Child process signal Interrupt return Info code:%d\n", Wtermsig (status)); }else if (wifstopped (status)) {printf ("Child process pause return Info code:%d\n", Wstopsig (status)); }else {printf ("Other exit info! \ n "); }}else if (pid==0) {printf ("I am Child!\n"); Abort (); Exit (100); } printf ("Game is over!\n"); return 0;}
The wait () function successfully returns the PID that waits for the subprocess, and the failure returns-1
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include < errno.h> #include <sys/types.h> #include <sys/wait.h>int main (int arg, char *args[]) { pid_t pid = 0;< C1/>int i = 0, ret = 0; for (i = 0; i < i++) { pid = fork (); if (PID = =-1) { printf ("fork () failed! Error message:%s\n ", Strerror (errno)); return-1; } if (PID = = 0) { printf ("Child haved run!\n"); Exit (0); } } The return value of the while (1) { //wait () function is the PID ret = Wait (NULL) of the child process; printf ("Sub-process pid=%d\n", ret); if (ret = =-1) { //parent process wait () function blocking process, it is possible to be interrupted by other signals, need to do exception handling if (errno = = eintr) { continue; } Break ; } } printf ("Game is over!\n"); return 0;}
Waitpid function: An End Function prototype to wait for a particular process: pid_t waitpid (pid_t pid, int *status, int options), parameter: status if not empty, Writes the status information to the location it points to. Options allow changing the behavior of waitpid, the most useful option is Wnohang, which is to prevent the waitpid to suspend the caller's execution of the return value: A successful return of the PID waiting for the child process, failed to return 1
The Linux wait function is detailed