早上好,
我正在尝试学习如何使用彼得森的关键部分保护解决方案。每个进程都试图将总数增加到 100,000,我必须确保每个孩子都调用 process#()。我还需要使用"等待"功能,以便父母知道孩子何时完成。孩子完成后,我需要打印进程 ID 和进程 1 中断进程 2 的次数,反之亦然。我真的不知道我在做什么,即使我已经阅读了很多。我应该使用的"等待"功能是什么?如何使用它?为什么我的代码递增到 200,000 而不是 100,000?
Code removed, unnecessary for question.
显然在主函数的某个地方,我需要循环让父级等待子项,然后打印子项的进程 ID,但我不知道该怎么做。
您引用的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吗?