设为首页 加入收藏

TOP

Linux系统调用跟我学――僵尸进程(三)
2010-12-30 20:28:22 】 浏览:16134
Tags:Linux 系统 调用 跟我学 僵尸 进程
时wait返回-1,同时errno被置为ECHILD。

实战

下面就让我们用一个例子来实战应用一下wait调用,程序中用到了系统调用fork,如果你对此不大熟悉或已经忘记了,请参考上一篇文章进程管理相关的系统调用(1)

/* wait1.c */
#include
#include
#include
#include
main()
{
pid_t pc,pr;

pc=fork();

if(pc<0) /* 如果出错 */
printf("error ocurred!n");
else if(pc==0){ /* 如果是子进程 */
printf("This is child process with pid of %dn",getpid());
sleep(10); /* 睡眠10秒钟 */
}
else{ /* 如果是父进程 */
pr=wait(NULL); /* 在这里等待 */
printf("I catched a child process with pid of %dn"),pr);
}
exit(0);
}


编译并运行:

$ cc wait1.c -o wait1
$ ./wait1
This is child process with pid of 1508
I catched a child process with pid of 1508


可以明显注意到,在第2行结果打印出来前有10秒钟的等待时间,这就是我们设定的让子进程睡眠的时间,只有子进程从睡眠中苏醒过来,它才能正常退出,也就才能被父进程捕捉到。其实这里我们不管设定子进程睡眠的时间有多长,父进程都会一直等待下去,读者如果有兴趣的话,可以试着自己修改一下这个数值,看看会出现怎样的结果。

参数status

如果参数status的值不是NULL,wait就会把子进程退出时的状态取出并存入其中,这是一个整数值(int),指出了子进程是正常退出还是被非正常结束的(一个进程也可以被其他进程用信号结束,我们将在以后的文章中介绍),以及正常结束时的返回值,或被哪一个信号结束的等信息。由于这些信息被存放在一个整数的不同二进制位中,所以用常规的方法读取会非常麻烦,人们就设计了一套专门的宏(macro)来完成这项工作,下面我们来学习一下其中最常用的两个:

● WIFEXITED(status)

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

首页 上一页 1 2 3 4 5 6 7 下一页 尾页 3/12/12
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇设计Linux系统网络设备驱动程序 下一篇 Linux系统调用跟我学――进程管理

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目