本文出自http://www.wenbanana.com/?p=363稻草人博客,欢迎访问!
pid_t wait(int * stat_loc)
包含的头文件: #include <sys/types.h>
#include <sys/wait.h>
返回值:子进程的PID
参数:如果stat_loc不是一个空指针,状态信息将被写入它指向的位置
sys/wait.h文件爱你中的状态信息见下表:
-----------------------------------------------------------------------------------------------------------------
宏定义 说明
-----------------------------------------------------------------------------------------------------------------
WIFEXITED(stat_val) 如果子进程正常结束,它就取一个非零值
WEXITSTATUS(stat_val) 如果WIFEXITED非零,它返回子进程的退出码
WIFSIGNALED(stat_val) 如果子进程因为一个未捕获的信号而终止,它就取一个非零值
WTERMSIG(stat_val) 如果WIFSIGNALED非零,它返回一个信号代码
WIFSTOPPED(stat_val) 如果子进程终止,它就取一个非零值
WSTOPSIG(stat_val) 如果WIFSTOPPED非零,它返回一个信号代码
-----------------------------------------------------------------------------------------------------------------
wait系统调用会使父进程暂停执行,直到它的一个子进程结束为止。
#include <sys/types.h> #include <sys/wait.h> #include <unistd.h> #include <stdio.h> int main(){ pid_t pid; char * message; int n; int exit_code; printf("fork program starting\n"); pid = fork(); switch(pid){ case -1: perror("fork failed"); exit(1); case 0: message ="This is the child"; n = 5; /*子进程的退出码*/ exit_code = 37; break; default: message = "This is the parent"; n = 3; /*父进程的退出码*/ exit_code = 0; break; } /*pid非0,在父进程执行*/ if(pid){ int stat_val; pid_t child_pid; /*父进程直到子进程推出后执行*/ child_pid = wait(&stat_val); printf("Child process has finished: PID=%d\n",child_pid); if(WIFEXITED(stat_val)) /*子进程正常结束,输出子进程退出码,即exit_code=37*/ printf("Child exited with code %d\n", WEXITSTATUS(stat_val)); else /*子进程非正常结束*/ printf("Child terminated abnormally\n"); } for(; n > 0; n--){ puts(message); sleep(1); } exit(exit_code); }
然后,父进程继续执行,通过测试wait调用的返回值确定子进程的已经正常结束,并从状态信息里提取出子进程的退出码。
运行效果见下图:
参考文献:Linux程序设计