当一个进程终止之后,内核向父进程发送一个SIGCHLD。默认这个信号被忽略,进程可以通过singnal()或者sigaction()系统调用来处理这个信号。父进程希望得到子进程终止的更多信息,比如返回值,甚至显式的等待这个事件的到来,这就是wait或者waitpid,它们可以做:
1)阻塞,如果子进程仍然在执行。
2)立即返回,包含子进程的终止状态,如果一个子进程终止,等待它的终止状态被获取。
3)返回错误,如果它没有子进程。
pid_t wait(int *statloc); pid_t waitpid(pid_t pid, int *statloc, intoptions);
1. #include <sys/wait.h> 2. 3. int WIFEXITED(status); //子进程正常结束 4. int WIFSIGNALED(status); //被异常终止 5. int WIFSTOPPED(status); //被暂停 6. int WIFCONTINUED(status); //继续运行时 7. 8. int WEXITSTATUS(status); //获取正常结束时的返回值 9. int WTERMSIG(status); //获取异常终止信号 10. int WSTOPSIG(status); //获取引起子进程暂停的信号 11. int WCOREDUMP(status); //获取子进程异常终止所产生的内核文件WIFEXITED: 如果子进程正常终止,返回 true 。可以通过 WEXITSTATUS 得到参数的低 8 位。
1. #include <unistd.h> 2. #include <stdio.h> 3. #include <sys/types.h> 4. #include <sys/wait.h> 5. 6. int main(void){ 7. int status; 8. pid_t pid; 9. 10. if(! fork()){ 11. return 1; 12. } 13. 14. pid = wait(&status); 15. if(pid == -1) 16. perror("wait"); 17. printf("pid=%d\n",pid); 18. 19. if(WIFEXITED(status)) 20. printf("Normal termination with exit status=%d\n",WEXITSTATUS(status)); 21. if(WIFSIGNALED(status)) 22. printf("Killed by signal=%d%s\n",WTERMSIG(status),WCOREDUMP(status)); 23. if(WIFSTOPPED(status)) 24. printf("Stopped by signal=%d\n",WSTOPSIG(status)); 25. if(WIFCONTINUED(status)) 26. printf("Continued\n"); 27. 28. return 0; 29. }
waitpid
1. int status; 2. pid_t pid; 3. pid = waitpid (1742, &status, WNOHANG); 4. if (pid == -1) 5. perror ("waitpid"); 6. else { 7. printf ("pid=%d\n", pid); 8. if (WIFEXITED (status)) 9. printf ("Normal termination with exit status=%d\n",WEXITSTATUS (status)); 10. if (WIFSIGNALED (status)) 11. printf ("Killed by signal=%d%s\n",WTERMSIG (status),WCOREDUMP (status) ? " (dumped core)" : ""); 12. }