linux编程取消wait函数,Linux编程基础之进程等待(wait()函数).pdf

Linux编程基础之进程等待(wait()函数)

编程过程中,有时需要让一个进程等待另一个进程 ,最常见的是父进程等待自己的子进程 ,或者父进程回收自己

的子进程资源包括僵尸进程。这里简单介绍一下系统调用函数 :wait()

函数原型是

#include 

#include 

int wait(int *status)

函数功能是 :父进程一旦调用了wait就立即阻塞自己,由wait 自动分析是否当前进程的某个子进程已经退出,如

果让它找到了这样一个已经变成僵尸的子进程 ,wait就会收集这个子进程的信息 ,并把它彻底销毁后返回;如果

没有找到这样一个子进程 ,wait就会一直阻塞在这里 ,直到有一个出现为止。

注 :

当父进程忘了用wait()函数等待已终止的子进程时,子进程就会进入一种无父进程的状态,此时子进程就是僵尸

进程.

wait()要与fork()配套出现,如果在使用fork()之前调用wait(),wait()的返回值则为­1,正常情况下wait()的返回值为

子进程的PID.

如果先终止父进程,子进程将继续正常进行 ,只是它将由init进程(PID 1)继承,当子进程终止时,init进程捕获这

个状态.

参数status用来保存被收集进程退出时的一些状态 ,它是一个指向int类型的指针。但如果我们对这个子进程

是如何死掉毫不在意 ,只想把这个僵尸进程消灭掉 ,(事实上绝大多数情况下 ,我们都会这样想),我们就可以

设定这个参数为NULL ,就像下面这样 :

pid   wait(NULL);

如果成功 ,wait会返回被收集的子进程的进程ID ,如果调用进程没有子进程 ,调用就会失败 ,此时wait返回­1 ,

同时errno被置为ECHILD。

如果参数status的值不是NULL ,wait就会把子进程退出时的状态取出并存入其中, 这是一个整数值

(int ),指出了子进程是正常退出还是被非正常结束的 ,以及正常结束时的返回值 ,或被哪一个信号结束的等信

息。由于这些信息 被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦 ,人们就设计了一套

专门的宏(macro )来完成这项工作 ,下面我们来学习一下其中最常用的两个 :

1 ,WIFEXITED(status) 这个宏用来指出子进程是否为正常退出的 ,如果是 ,它会返回一个非零值。

(请注意 ,虽然名字一样 ,这里的参数status并不同于wait唯一的参数–指向整数的指针status ,而是那个指针所

指向的整数 ,切记不要搞混了。)

2 , WEXITSTATUS(status)  当WIFEXITED返回非零值时 ,我们可以用这个宏来提取子进程的返回值 ,如果子进

程调用exit(5)退出,WEXITSTATUS(status) 就会返回5 ;如果子进程调用exit(7) ,WEXITSTATUS(status)就会返

回7。请注意 ,如果进程不是正常退出的 ,也就是说 , WIFEXITED返回0 ,这个值就毫无意义。

代码示例 :wait.c

1 #include 

2 #include 

3 #include 

4 #include 

5 #include 

6 #include 

7 #include 

8 /***********************************************************

9     功能说明 :进程等待wait()方法的应用

10     author: linux.sir@

11

12 ***********************************************************/

13 void waitprocess();

14

15

16 int main(int argc, char * argv[])

17 {

18   waitprocess();

19

20 }

21

22 void waitprocess()

23 {

24

25   int count   0;

26

27   pid_t pid   fork();

28   int status   ­1;

29

30   if(pid<0)

31   {

32     printf("fork error for %m\n",errno

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值