【问题标题】:The waitpid() parameterswaitpid() 参数
【发布时间】:2014-02-28 10:09:45
【问题描述】:

我对 waitpid 参数有疑问。 我应该在 p[0] 完成后启动 p[1](进程 1)。

这是从 p0 开始的:

if(p[0] == 0){
    process(0,1); //(process, duration(time))
    return 0;
}

现在我希望 p1 在 p0 结束后立即开始(1 秒后)

if(p[1] == 0){
    process(1,2);
    return 0;
}
waitpid(p[0], NULL, 0);

这是我的问题:waitpid 中的参数是什么意思?最后一个参数是否应该设置为 1,因为 p[0] 在 1 秒后结束,这是我希望 p[1] 开始的时间?

【问题讨论】:

标签: c linux process


【解决方案1】:

waitpid 中的参数是什么意思?

您可以查阅waitpid(3) 的手册了解其参数的含义。

在你的情况下,

waitpid(p[0], NULL, 0);

意思

  • p[0]:等待 pid 保持在 p[0]
  • NULL: 不在乎地位
  • 0: 没有标志

是否应该将最后一个参数设置为 1,因为 p[0] 在 1 秒后结束,这是我希望 p[1] 开始的时间?

为了实现您的目标,在进程 0 结束后立即启动进程 1,您应该将 waitpid(...); 语句放在用于创建进程 1 的 fork() 之前,并在调用 waitpid() 时使用正确的参数。

【讨论】:

  • 链接的文档没有解释系统调用选项。
  • @MatheusSantana 我仔细检查了一遍,它解释了waitpid() 的所有三个参数。
  • 它是否解释了“给出 0 意味着您没有指定任何标志”(如建议的 here)?我对此感到困扰,因为我认为 0 可能是某个标志的值,而我无法从手册页中获取答案。
  • @MatheusSantana 我相信确实如此,“选项参数是由以下标志中的零个或多个按位包含 OR 构造的”,因此零意味着没有额外的选项。
  • @MatheusSantana 很难说,但是,如果我面临同样的问题,我会参考他们两个,并始终牢记一般规则:第三部分中的信息不太特定于系统与第二节相比。顺便说一句,感谢您的版本建议,它使答案更清晰。
【解决方案2】:

完整的文档在手册页或这里:http://linux.die.net/man/2/waitpid

基本上你有3个参数:

pid_t waitpid(pid_t pid, int *status, int options);

pid 是您正在等待的进程。除非您正在等待多个子进程(在这种情况下,请指定 0、-1 或小于 -1 的数字 - 手册页中的详细信息),请在此处指定进程的 pid。

status 是一个指向整数的指针,将填写退出状态。这是进程的退出状态和它如何退出(或没有退出)的描述的组合。手册页为您提供了可用于理解这一点的宏。

options可以填多个flag,ored在一起。其中最有用的是名称有点奇怪的W_NOHANG,它让waitpid 简单地告诉您进程是否已经完成(如果是,它的退出状态是什么)而不是等待它完成。

【讨论】:

  • 但是为options 参数提供0 值是什么意思?
  • 给出 0 表示您没有指定任何标志(例如,不是W_NOHANG,也没有其他标志)
【解决方案3】:

它通常用于等待特定进程完成(或者如果您使用特殊标志,则更改状态),具体取决于其进程 ID(也称为 pid)。

它还可以用于等待一组子进程中的任何一个,无论是来自特定进程组的一个还是当前进程的任何子进程。

例如

pid_t child_pid;
int status;

child_pid = fork();

if (child_pid == 0) {
     // in child; do stuff including perhaps exec
} else if (child_pid == -1) {
     // failed to fork 
} else {
     if (waitpid(child_pid, &status, 0) == child_pid) {
          // child exited or interrupted; now you can do something with status
     } else {
          // error etc
     }
 }

关于waitpid中的参数没有如下

第一个参数:pid_t pid

这是您等待进程退出的进程的pid

第二个参数:int *status

它是程序的当前状态,你可以使用宏来测试每个条件,例如 WIFEXITED , WIFSIGNALED

第三个参数:int options

options 参数应为 0。您不需要实现任何选项。 (但是,您的系统应检查以确保不请求您不支持的选项。)

【讨论】:

  • 但是为options 参数提供0 值是什么意思?
猜你喜欢
  • 2016-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多