函数waitpid和WTERMSIG说明
2015-11-06 12:02
393 查看
waitpid系统调用在Linux函数库中的原型是:
从本质上讲,系统调用waitpid和wait的作用是完全相同的,但waitpid多出了两个可由用户控制的参数pid和options,从而为我们编程提供了另一种更灵活的方式。下面我们就来详细介绍一下这两个参数:
从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:
如果我们不想使用它们,也可以把options设为0,如:
如果使用了WNOHANG(wait no hung)参数调用waitpid,即使没有子进程退出,它也会立即返回,不会像wait那样永远等下去。
而WUNTRACED参数,由于涉及到一些跟踪调试方面的知识,加之极少用到,这里就不多费笔墨了,有兴趣的读者可以自行查阅相关材料。
WTERMSIG(status)
取得子进程因信号而中止的信号
#include <sys/types.h> #include <sys/wait.h> pid_t waitpid(pid_t pid,int *status,int options) |
从参数的名字pid和类型pid_t中就可以看出,这里需要的是一个进程ID。但当pid取不同的值时,在这里有不同的意义。
pid>0时,只等待进程ID等于pid的子进程,不管其它已经有多少子进程运行结束退出了,只要指定的子进程还没有结束,waitpid就会一直等下去。
pid=-1时,等待任何一个子进程退出,没有任何限制,此时waitpid和wait的作用一模一样。
pid=0时,等待同一个进程组中的任何子进程,如果子进程已经加入了别的进程组,waitpid不会对它做任何理睬。
pid<-1时,等待一个指定进程组中的任何子进程,这个进程组的ID等于pid的绝对值。
options提供了一些额外的选项来控制waitpid,目前在Linux中只支持WNOHANG和WUNTRACED两个选项,这是两个常数,可以用"|"运算符把它们连接起来使用,比如:
ret=waitpid(-1,NULL,WNOHANG | WUNTRACED); |
ret=waitpid(-1,NULL,0); |
而WUNTRACED参数,由于涉及到一些跟踪调试方面的知识,加之极少用到,这里就不多费笔墨了,有兴趣的读者可以自行查阅相关材料。
WTERMSIG(status)
取得子进程因信号而中止的信号
#include <sys/wait.h> int WTERMSIG(int status);
相关文章推荐
- 百度大数据+零售发挥引擎优势 ------BDL ,大数据+亚当科茨领导的人工智能实验室和由张潼领导的大数据实验室
- 记一次Time-Wait导致的问题
- Flashback还原failover的备库实验
- 非互质中国剩余定理求线形模方程组(形如 X%mi=ai)
- leetcode-Factorial Trailing Zeroes
- Elasticsearch _analyze, _explain和 _search_shards工具
- Google Apps - Gmail API的通知功能
- svn commit: remains in tree-conflict
- NSSearchPathForDirectoriesInDomains
- HDU 4756 Install Air Conditioning 块与块,非树边最短路
- 谷歌人工智能算法RankBrain运行原理解析
- Leetcode #172 Factorial Trailing Zeroes
- Hibernate的加载抓取方式:Failed to lazily initialize a collection - no session
- golang sync.WaitGroup解决goroutine同步
- Caused by: org.hibernate.TransactionException: unable to commit against JDBC connection
- org.hibernate.TransactionException: commit failed
- Canvas和Paint画折线图
- poj1765 November Rain 扫描线
- nat表中各条chain的工作流程
- anon vma chain