Linux下C语言开发(进程控制编程——wait()、waitpid())

wait()和wait()函数说明

wait()函数用于使父进程(也就是调用wait()的进程)阻塞,直到一个子进程结束或该进程接收到一个指定的信号为止。如果该父进程没有子进程或它的子进程已经结束,则wait()就会立即返回。waitpid()的作用和wait()一样,但它并不一定要等待一个终止的子进程,它还有若干选项,如可提供一个非阻塞版本的wait()功能,也能支持作用控制。实际上,wait()函数只是waitpid()函数的一个特例,在Linux内部实现wait()函数时直接调用的就是waitpid()函数。

wait()和waitpid()函数格式说明以及函数测试

wait()函数语法要点:


【status为NULL】:

1、没有子进程下的wait()函数测试,测试代码如下:测试文件名为wait.c


保存后,输入gcc wait.c -o wait编译生成二进制文件,然后输入./wait执行此程序,执行结果如下:


2、测试有一个子进程下的wait()函数,并且该子进程不退出,测试代码如下:文件名为wait.c


保存后,输入gcc wait.c -o wait编译生成二进制文件,然后输入./wait执行此程序,执行结果如下:


3、测试有一个子进程下的wait()函数,使其子进程退出,测试代码如下:文件名为wait.c


保存后,输入gcc wait.c -o wait编译生成二进制文件,然后输入./wait执行此程序,执行结果如下:


4、测试有多个子进程下的wait()函数,使其中一个子进程不退出,测试代码如下:文件名为wait.c


保存后,输入gcc wait.c -o wait编译生成二进制文件,然后输入./wait执行此程序,执行结果如下:



总结】:当status为NULL时,只要有子进程退出,wait()退出阻塞(且返回值为退出的子进程的进程号),否则一直阻塞直到有子进程退出。当调用wait()函数的进程没有子进程时,返回-1。


【status不为NULL】:

如果参数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,这个值就毫无意义了。


测试子进程正常退出,测试代码如下:测试文件为wait1.c


保存后,输入gcc wait.c -o wait1编译生成二进制文件,然后输入./wait1执行此程序,执行结果如下:



waitpid()函数语法要点:



【waitpid()使用实例】

本例中首先使用fork()创建一个子进程,然后让其子进程暂停5s(使用了sleep()函数)。接下来对原有的父进程使用waitpid()函数,并使用WNOHANG使该父进程不会阻塞(即waitpid()不会阻塞)。若有子进程退出,则waitpid()返回子进程号;若没有子进程退出,则waitpid()返回0,并且父进程每隔1s循环判断一次。该程序的流程图如下:


源代码如下:文件为waitpid.c


保存后,输入gcc wait.c -o waitpid编译生成二进制文件,然后输入./waitpid执行此程序,执行结果如下:


现在将waitpid.c文件中的"pr = waitpid(pc, NULL, WNOHANG);"分别改为"pr = waitpid(pc, NULL, 0);"和"pr = wait(NULL);",运行结果分别为:



都是隔了5s才打印"Get child exit code: xxx"。说明改为"pr = waitpid(pc, NULL, 0);"和"pr = wait(NULL);"都会使父进程阻塞,但是当子进程退出,"pr = waitpid(pc, NULL, 0);"和"pr = wait(NULL);"返回值都为子进程的进程号。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值