《UNIX网络编程》wait和waitpid函数
来源:互联网 发布:网络教育费用是多少 编辑:程序博客网 时间:2024/06/05 03:38
之前的内容里我们用wait来处理已经终止的子进程,waitpid的功能和wait类似,但也有区别。
wait和waitpid的函数模型:
pid_t wait(int *statloc);pid_t waitpid(pid_t pid, int *statloc, int options);
返回值:若成功则返回进程的ID, 出错则返回0或者-1
相同点
函数wait和waitpid均返回两个值,已经终止进程的pid,以及通过statloc指针返回的子进程的终止状态(一个整数)。我们可以调用三个宏来检查终止状态,来辨别子进程是否正常终止、由某个信号杀死还是仅仅由作业控制停止而已。另外有些宏接着获取子进程退出状态、杀死子进程的信号值或者停止子进程的作业信号控制值。
不同点:
如果调用wait的进程没有已终止的子进程,不过有一个或者多个子进程正在运行,那么那么wait将阻塞到现有子进程第一个终止为止。
waitpid函数就等待进程和是否阻塞给我们了更多控制权。首先,pid参数允许我们指定想等待的进程pid,值-1表示等待第一个终止的子进程。其次。options参数允许我们指定附加选项,如WNOHANG,它告知内核在没有终止子进程的时候不要阻塞。
处理僵尸进程
wait版:
#include <unp.h>voidsig_chld(int signo){ pid_t pid; int stat; pid = wait(&stat); printf("child %d terminated\n", pid); return; }
waitpid版本:
#include <unp.h>voidsig_chld(int signo){ pid_t pid; int stat; while( (pid = waitpid(-1, &stat, WNOHANG)) > 0) printf("child %d terminated\n", pid); return; }
其中 uno.h 参考文章 http://blog.csdn.net/thinkerleo1997/article/details/75631157
在处理僵尸进程的时候,只需要在fork前加入代码signal(SIGCHLD, sig_child);
即可。
但是处理多个产生的僵尸进程时,wait的功能不足以处理所有的僵尸进程,此时就要用到waitpid函数。
阅读全文
0 0
- 《UNIX网络编程》wait和waitpid函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- 深入浅出---unix多进程编程之wait()和waitpid()函数
- UNIX编程专题-wait和waitpid详解
- 网络编程中的wait和waitpid
- 【Linux编程】wait和waitpid函数
- [置顶]深入浅出---unix多进程编程之wait()和waitpid()函数
- wait 和waitpid函数
- wait和waitpid函数
- wait() 和waitpid() 函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait和waitpid函数
- wait()和waitpid()函数
- Error: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException:
- redis中set集合的命令
- UVa442 例题6-3 矩阵链乘(Matrix Chain Multiplication)
- vld2.5.1在vs2015中的配置细节
- [Leetcode] 311. Sparse Matrix Multiplication 解题报告
- 《UNIX网络编程》wait和waitpid函数
- 标准C++中的string类的用法总结
- pandas如何去掉、过滤数据集中的某些值或者某些行?
- mysql状态查看 QPS/TPS/缓存命中率查看
- FZU 2253 Salty Fish
- OC 常用的宏定义
- Collections与Arrays工具类
- 安卓走马灯
- 2017杭电多校联赛-Function