关于 wait 与 waitpid 中的参数:status
用到的代码:
1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<unistd.h>
4 #include<sys/wait.h>
5 int main()
6 {
7 pid_t pid = fork();
8 if(pid < 0)
9 {
10 perror("fork error");
11 return -1;
12 }
13 else if(pid == 0)
14 {
15 sleep(3);
16 exit(1);
17 }
18 int status;
19 while(waitpid(-1,&status,WNOHANG) == 0)//为了等待子进程退出
20 {
21 printf("先打一会儿篮球,再去买水喝\n");
22 sleep(1);
23 }
24 if(status & 0x7f)//子进程异常退出时才会进入,这时的(status & 0x7f)>0.
25 {
26 printf("program error!\n");
27 return -1;
28 }
29 printf("exit child code:%d\n",((status >> 8)&0xff));
30 while(1)
31 {
32 printf("------\n");
33 sleep(1);
34 }
35 return 0;
36 }
status 参数是一个输出型参数,由操作系统填充。 如果传递NULL,表示不关心子进程的退出状态信息。如果不为空, 操作系统会根据该参数,将子进程的退出信息反馈给父进程。
虽然 status 是一个 int ,但是它的高两个字节根本没有用到,所以我们只研究status低16位。在低16位中,其中:
-
status的低16位的高8位保存子进程的返回值,如果我们想要获取子进程的返回值,就是说要获取低16位的高八位。(如果子进程正常退出(exit) —则高8位是子进程的返回值,低8位中的低7位是0):
为了验证子进程正常退出时候的高8位的返回值 与 低7位的值(此时是 0):
-
status的低16位的低8位中保存子进程异常退出的信号值,其实也只用到了其中的低7位,如果我们想要获取子进程的异常退出信号值,就是说要获取低16位的低7位。(如果子进程异常退出—则高8位的子进程的返回值是0,低8位中的低7位的异常退出信号值不为0):
为了验证子进程异常退出时低7位所给出的结果,在程序运行后,我将 kill 子进程,程序的运行后结果为:
-
上述是我们分析的过程,但是为了更加方便我们获取子进程退出的返回值,系统给我们提供了宏函数来更加方便的获取;
子进程正常退出,获取返回值为 1:
可见,这样获取更加方便!!!