Linux系统中waitpid函数的使用实例

本文最后更新于:2022年3月23日 上午

在写完OSTEP第五章课后习题之后,通过第八题的答案记录一下自己目前对waitpid()的尝试结果,目前的尝试仅限于进程执行的阻塞和等待,轮询和非阻塞的状态暂时没有遇到,日后补充。

进程等待

waitpid()不能用于子进程等待更早的另外一个子进程,如果尝试运行则会返回-1。(在父进程中则等待并返回子进程对应的pid)

这里举例说明,以下为一个不包含任何waitpid()的原始代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
// 创建第一个子进程
int rc_1 = fork();
if (rc_1 == 0)
{
exit(0);
}

// 创建第二个子进程
int rc_2 = fork();
if (rc_2 == 0)
{
exit(0)
}
return 0;
}

该代码通过waitpid()函数可以实现在rc_1rc_2都执行完毕之后,再执行主进程的内容,修改如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int main()
{
// 创建第一个子进程
int rc_1 = fork();
...

// 创建第二个子进程
int rc_2 = fork();
...

waitpid(rc_1, NULL, 0); // 等待第一个进程(pid为rc_1的进程)结束
waitpid(rc_2, NULL, 0); // 等待第二个进程(pid为rc_2的进程)结束
return 0;
}

但是在子进程中调用waitpid()是不能做到让rc_2等待rc_1的。参考:stackoverflow

比如修改rc_2的代码如下

1
2
3
4
5
6
int rc_2 = fork();
if (rc_2 == 0)
{
int wr = waitpid(rc_1, NULL, 0);
exit(0)
}

通过以上的代码并不能让rc_2等待rc_1,如果尝试输出wr会得到wr == -1(在父进程中则应该是等待进程的pid)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!