文件:wait(int
#include *status); waitpid(pid_t pid, int *status, int options); 这两个函数都是用于去侦察子进程的,就像是两个侦察兵,看看子进程 的 状 态 如果子进程的状态变化了,这些调用函数马上就会返回,如果没有变化直参 status- pid option 返 回是是 的子一 父到 子进进 程程 就的数是 子进些 进程参程 的的数状 会状 态被变 阻化 塞 ; : 态 pid 宏 WNOHANG-没有孩子时,函数立即返回 WUNTRACED-如果一个孩子被停止了,函数则返回 WCONTINUED-如果一个被停止的孩子被信号SIGCONT激活 返回的 status 需要一些宏来进行解析: , 函 数 则 返 回 。 WIFEXITED(status):如果孩子正常终止则值为真 WEXITSTATUS(status):返回孩子的状态,由status的低8位组成,只有在WIFEXITED(status)为真时(也就是孩子正常死亡时)才能调用 WIFSIGNALED(status):如果孩子是被信号谋杀的则为真 WTERMSIG(status):返回谋杀孩子的信号数杀手,只有确定信号是 杀 手 时 才 调 用 WIFSTOPPED(status):如果孩子是被信号停止的则为真 WSTOPSIG(status):返回能停止孩子的信号数 WIFCONTINUED(status):如果孩子是被信号SIGCONT重新激活的 ex: 运 行 结 果 : 则 返 回 真 jack@jack-K45VD:~/桌面/Mine_Linux_Program$ ./a.out & [3] 4944 jack@jack-K45VD:~/桌面/Mine_Linux_Program$ Child PID is 4945 kill stopped by -STOP signal 4945 19 jack@jack-K45VD:~/桌面/Mine_Linux_Program$ kill -CONT 4945 continued jack@jack-K45VD:~/桌面/Mine_Linux_Program$ kill -TERM 4945 killed jack@jack-K45VD:~/[3]+ 完 by 桌成桌 面面 signal 15 /Mine_Linux_Program$ ./a.out jack@jack-K45VD:~//Mine_Linux_Program$ #include #include #include #include int main(int { if (cpid == 0) { /* Code executed by child */ printf(\"Child if PID is (argc %ld\\n\ (long) == getpid()); 1) if cpid (cpid = == -1) fork(); { pid_t int cpid, w; status; argc, char *argv[]) perror(\"fork\"); exit(EXIT_FAILURE); } pause(); /* WaitEXIT_FAILURE for signals */ } else { /* Code executed by parent */ do { _exit(atoi(argv[1])); w = waitpid(cpid, &status, WUNTRACED | WCONTINUED); if (WIFEXITED(status)) {// 正 常 终 if (w == -1) { perror(\"waitpid\"); exit(EXIT_FAILURE); } 止 printf(\"exited, status=%d\\n\WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) {//被信号终止 printf(\"killed by signal %d\\n\WTERMSIG(status)); } else if (WIFSTOPPED(status)) {//被信号停止 printf(\"stopped by signal %d\\n\WSTOPSIG(status)); } else if (WIFCONTINUED(status)) {//被信号激活 printf(\"continued\\n\"); } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); exit(EXIT_SUCCESS); } } 因篇幅问题不能全部显示,请点此查看更多更全内容