If status is not NULL, wait() and waitpid() store status information in the int to which it points.
This integer can be inspected with the following macros (which take the integer itself as an argument,
not a pointer to it, as is done in wait() and waitpid()!):WIFEXITED(status)returns true if the child terminated normally, that is, by calling exit(3) or _exit(2), or byreturning from main().WEXITSTATUS(status)returns the exit status of the child. This consists of the least significant 8 bits of thestatus argument that the child specified in a call to exit(3) or _exit(2) or as the argumentfor a return statement in main(). This macro should be employed only if WIFEXITED returnedtrue.WIFSIGNALED(status)returns true if the child process was terminated by a signal.WTERMSIG(status)returns the number of the signal that caused the child process to terminate. This macro shouldbe employed only if WIFSIGNALED returned true.
pid_t waitpid(pid_t pid, int *status, int options);pida. <-1 -組idb. -1 回收任意c. 0 回收和調用進程組id相同組內的子進程d. >0 回收指定的pidoptionsa. 0與wait相同,也會阻塞b. WNOHANG 如果沒有當前子進程立即退出的,會立刻返回返回值a.如果設置了,WNOHANG,1).如果沒有子進程退出,返回02).如果有子進程退出,返回退出的pidb. 失敗返回-1(沒有子進程)
< -1 meaning wait for any child process whose process group ID is equal to the absolute value ofpid.-1 meaning wait for any child process.0 meaning wait for any child process whose process group ID is equal to that of the callingprocess.> 0 meaning wait for the child whose process ID is equal to the value of pid.
用wait 回收多個子進程 調用案例
用waitpid函數回收多個子進程調用案例
#include "stdio.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "stdlib.h"
#include "unistd.h"int main() {int i;int n = 5;pid_t pid;pid_t wpid;for(i=0; i<n; ++i) {pid = fork();if(pid == 0) {break;}}if(i==5) {printf("my is father progress !\n");while(1) {wpid = waitpid(-1, NULL, WNOHANG);if(wpid==-1) {printf("zi ji cheng hui shou wan bi\n");break;} else if (wpid>0) {printf("hui shou de zi jin cheng pid is%d\n", wpid);}} while(1) {sleep(1);}}if(i<5) {printf("my is son progress! my pid is%d\n", getpid());} return 0;
}
#include "stdio.h"
#include "stdlib.h"
#include "sys/types.h"
#include "sys/wait.h"
#include "unistd.h"int main () {pid_t pid;pid_t wpid;int status;pid = fork();if(pid==0) {// zi jin chengexecl("./test3gz.out", "test3gz.out", NULL);} else {while(1) {wpid = waitpid(-1, &status, WNOHANG);if(wpid == -1) {printf("suo you zi jin cheng tui chu\n");break;} else if(wpid>0) {printf("tui chu de zi jin cheng pid shi%d\n", wpid);printf("status is %d\n", status);if(WIFEXITED(status)) {printf("zheng chang tui chu return status is %d\n", WEXITSTATUS(status));}if(WIFSIGNALED(status)) {printf("zi ji cheng kill by signal is %d\n", WTERMSIG(status));}}} while(1) {sleep(1);}}return 0;
}
輸出:
a. 當test3gz.out沒有發生浮點型錯誤的時候
this is test3gz.c
k = 3
tui chu de zi jin cheng pid shi18293
status is 0
zheng chang tui chu return status is 0
suo you zi jin cheng tui chu
b. 當test3gz.out發生浮點型錯誤的時候
tui chu de zi jin cheng pid shi18278
status is 136
zi ji cheng kill by signal is 8
suo you zi jin cheng tui chu