失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > c语言进程waitpid Linux下C语言开发(进程控制编程——wait() waitpid())

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

时间:2022-02-21 04:46:13

相关推荐

c语言进程waitpid 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);"返回值都为子进程的进程号。

如果觉得《c语言进程waitpid Linux下C语言开发(进程控制编程——wait() waitpid())》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。