waitpid()的参数

6

我有一个关于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]开始运行?

请阅读精细的手册:http://man7.org/linux/man-pages/man2/wait.2.html - alk
3个回答

4

"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()的所有三个参数。 - Lee Duhem
1
它有解释“给定0表示您未指定标志”吗(如此处所建议)?这让我感到困扰,因为我以为0可能是某些标志的值,而我在手册页中找不到答案。 - Matheus Santana
1
@MatheusSantana 我相信它是这样的,“options参数是由零个或多个以下标志的按位包含OR构造的”,因此零表示没有额外选项。 - Lee Duhem
1
@MatheusSantana 很难说,但如果我面临同样的问题,我会参考它们两个,并始终记住一般规则:第三部分的信息与第二部分相比不太系统特定。顺便说一句,感谢您的编辑建议,它使答案更清晰。 - Lee Duhem
那关于标志呢?我访问了@MatheusSantana提供的链接,但是我希望得到一个更复杂的答案。如果您能够谈一些第三个参数,那就太好了!谢谢。 - Cătălina Sîrbu
显示剩余2条评论

2

完整文档可以在man页或此处找到:http://linux.die.net/man/2/waitpid

基本上,您有三个参数:

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

pid是您正在等待的进程。除非您正在等待多个子进程(在这种情况下,请指定0、-1或小于-1的数字 - 有关详细信息,请参阅manpage),否则请在此处指定您的进程的pid

status是一个指向整数的指针,它将被填充为退出状态。这是进程退出状态和如何退出(或未退出)的描述的组合。manpage提供了一些宏,可用于理解此内容。

options可以填写许多标志,使用or运算符连接。其中最有用的是有些奇怪命名的W_NOHANG,它使waitpid仅告诉您进程是否已完成(如果已完成,则其退出状态是什么),而不是等待它完成。


1
但是,将“options”参数设置为“0”值意味着什么? - Matheus Santana
1
给定0意味着您未指定任何标志(例如不是W_NOHANG,也没有其他标志)。 - abligh

1

通常用于等待特定进程完成(或者如果您使用特殊标志,则更改状态),基于其进程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

等待进程退出的进程ID

第二个参数:int *status

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

第三个参数:int options

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


1
但是,将“options”参数设置为“0”值意味着什么? - Matheus Santana

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接