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