彼得森的解决方案在等待

时间:2016-02-20 08:24:06

标签: c linux-kernel wait critical-section

早上好,

我正在努力学习如何使用彼得森的关键部分保护解决方案。每个进程都试图将总数增加到100,000,我必须确保每个子进程调用进程#()。我还需要使用“等待”功能,以便父母知道孩子什么时候结束。一旦孩子完成,我需要打印进程ID和进程1中断进程2的次数,反之亦然。我真的不知道我在做什么,即使我已经阅读了很多。什么是我应该使用的“等待”功能?我该如何使用它?为什么我的代码增加到200,000而不是100,000?

Code removed, unnecessary for question.

显然在main函数的某个地方,我需要循环让父级等待子级,然后打印子级的进程ID,但我不知道如何执行此操作。

1 个答案:

答案 0 :(得分:1)

您所指的wait()命令(和waitpid())是您在父进程中用来“等待”子进程终止的命令(阻塞,意味着父进程不会继续执行直到孩子改变状态)。如果您的孩子终止而父母中没有wait(),则子进程将变为“僵尸”。 wait()有效地“收获”子进程。

这是waitpid()的签名:

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

status是一个变量,可以用来将一些信息从孩子返回到父母(例如,这个过程中断的次数(假设你在孩子中跟踪这个?));它是孩子的​​退出代码。假设你有一个PID为1234的孩子,你会打电话给waitpid(1234, &status 0)(如果你想等待非阻塞,你必须使用WNOHANG作为选项(如果没有孩子的话,它会立即返回退出)。查看http://linux.die.net/man/2/waitpid,因为您可以使用waitpid()-1等待任何子项退出的酷值(这与常规wait())。如果您有任何疑问,请发表评论,但希望这足以指出您正确的方向:)。

由于您希望在父级中“循环”以等待您的孩子,您可以完全跳过循环并使用正常的“阻塞”等待,或者您可以使用无阻塞等待的无限循环(或者一系列的,如果你不使用常规的wait(),每个孩子一个。

万一你不知道,你可以根据fork()的返回值确定你是在父母还是孩子,但我想你已经知道了。因此,在if(检查父级)的正文中,您将执行wait()

此外,process2()应该有while (k < 200000)吗?这可能是为什么你说它增加到200,000?