linux之wait函数 wait函数:成功:清理掉的子进程 ID;失败:-1 (没有子进程) #include #include pid_t wait(int *wstatus); wstatus是传出参数, a.wait函数有3个功能: (1)阻塞等待子进程退出 (2)回收子进程残留资源 (3)获取子进程结束状态(退出原因)。 b.可使用 wait 函数传出参数 status 来保存进程的退出状态。借助宏函数来进一步判断进程终止的具体原因。常用的宏函数可分为如下两组: (1)WIFEXITED(status)为非0 -----------进程正常结束 如果宏函数WIFEXITED(status)的返回值为真(非0),则进一步调用宏函数WEXITSTATUS(status),此函数返回的是子进程退出的值,比如exit(10),返回值就是10 (2) WEXITSTATUS(status) 如上宏为真,使用此宏---------获取进程退出状态 (exit 的参数) (3)WIFSIGNALED(status)为非0----------进程异常终止 如果宏函数WIFSIGNALED(status)的返回值为真(非0),则进一步调用宏函数WTERMSIG(status),此函数返回的是使子进程终止的那个信号的编号 (3) WTERMSIG(status) 如上宏为真,使用此宏----------取得使进程终止的那个信号的编号
wait函数的使用:wait.c - #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <sys/types.h>
- #include <sys/wait.h>
- int main()
- {
- pid_t pid,wpid;
- int status;
- pid = fork();
- if(pid==0){
- //让子进程异常退出
- execl("abnor","abnor",NULL);
- printf("---child, my parent=%d, going to sleep 3s\n",getppid());
- sleep(60);
- printf("--------------child die--------------\n");
- //exit(76);
- return 100;
- }
- else if(pid>0){
- wpid = wait(&status);//子进程的退出状态保存在status中
- if(wpid==-1){
- perror("wait error:");
- exit(1);
- }
- //子进程正常退出
- if(WIFEXITED(status)){//如果宏函数WIFEXITED(status)的返回值为真,则继续调用宏函数WEXITSTATUS(status),此函数返回的是子进程退出的值
- printf("child exit with %d\n",WEXITSTATUS(status));
- }
-
- //子进程异常退出
- //测试子进程异常退出(不是子进程自己异常):运行程序之后,新开终端 ps aux ,杀掉子进程,此时会打印 child killed by ...
- if(WIFSIGNALED(status)){
- printf("chile killed by %d\n",WTERMSIG(status));
- }
-
- while(1){
- printf("I am paraent, pid = %d, myson = %d\n",getpid(),pid);
- sleep(1);
- }
- }
- else{
- perror("fork");
- return 1;
- }
- return 0;
- }
复制代码
结果: |