【发布时间】:2016-05-20 20:58:35
【问题描述】:
我正在浏览系统调用 wait4() 的文档,并在其手册页中写到
这些功能已过时;在新程序中使用
waitpid(2)或waitid(2)。
所以,我浏览了waitpid() 的文档,发现两者是有区别的。
waitpid() 与wait4() 做同样的事情,但wait4(),根据手册页,
在
rusage指向的结构中额外返回关于孩子的资源使用信息。
两个系统调用定义如下
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
pid_t waitpid(pid_t pid, int *status, int options);
现在,我还读到还有另一个系统调用可以完成获取孩子的rusage 的额外工作,那就是getrusage()。
所以,我可以理解wait4() 可以做什么,通过使用waitpid() 和getrusage() 的组合可以做同样的事情。
但是,我不明白的是,让系统调用过时总是有充分的理由。但在这种情况下,感觉功能被分割了。
- 如果我想使用
waitpid()和getrusage()的组合,我 必须检查两次返回值,但情况并非如此wait4()。 - 另外,可以使用
wait4()来获取特定的rusage孩子,但waitpid()会给出所有孩子的rusage一起使用(如果与RUSAGE_CHILDREN一起使用)。如果子进程的数量多于少数,这听起来像是额外的开销。
为什么wait4() 被废弃了?似乎这让事情变得更难了。
【问题讨论】:
-
性能?有时您不想获取资源使用情况。最好有一个功能只做一件事。
-
@EdHeal,但是有一种方法可以使用
wait4()而无需获得rusage。必须将最后一个参数设为NULL。 -
@Haris 现在我想知道
wait4()正在使用哪个“rusage()”函数,因为它无法通过标准rusage()函数访问。我知道我们可以在/proc文件系统中找到信息,但我想说那更糟!
标签: c linux wait system-calls waitpid