【问题标题】:why did wait4() get replaced by waitpid()为什么wait4()被waitpid()取代
【发布时间】: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


【解决方案1】:

这是一个标准化和历史问题。 wait4 是 4.3BSD 系统调用,但 POSIX.1 保留了 waitpid

【讨论】:

  • 保留? waitpid() 也是旧系统调用还是后来引入的?
  • 记不清了,但都是旧的。如果认为 waitpid 比 wait3/wait4 更新一点???这个时候BSD引领创新很普遍,POSIX标准化是一项艰巨的任务……
【解决方案2】:

取自http://pubs.opengroup.org/onlinepubs/009695399/functions/wait.html

The waitpid() function shall be equivalent to wait() if the pid argument is 
(pid_t)-1 and the options argument is 0. Otherwise, its behavior shall be 
modified by the values of the pid and options arguments

所以提供waitpid()函数有三个原因:

To support job control

To permit a non-blocking version of the wait() function

To permit a library routine, such as system() or pclose(), to wait for its 
children without interfering with other terminated children for which the 
process has not waited

它还包括前面解释过的所有 wait() 功能

【讨论】:

  • 我觉得上面提到的原因也可以使用wait()变体来实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-20
相关资源
最近更新 更多