正确使用fork,wait,exit等

时间:2009-04-21 18:51:35

标签: c process fork system-calls

我有这个问题需要解决,我不知道怎么做,因为只有少数系统调用我们可以用它来解决它,我不知道它们对这种情况有什么帮助。

练习:
我有一个带有整数的矩阵[10] [1000000],对于每一行,我用fork()创建一个新进程。每个过程的想法是遍历该特定行的所有数字并找到特定的数字然后打印有关它的消息。这是问题的第一步,并且已经完成。第二步是在每行按顺序打印该数字的总次数。最后,这个数字的总发生次数。

电话:
我可以使用的系统调用在本练习的文档中描述如下:

  • pid_t fork(void);
  • void exit(int status);
  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

问题:
我不知道怎么做,因为exit()调用只允许我传递低于256的数字,如果出现次数大于这个数字怎么办?我该怎么回复这个号码?

另一个问题:
我并不完全理解wait()waitpid()之间的区别以及如何/在哪里使用其中一个。除了手册页,还有更多的文档,我可以看到代码示例,以便更好地理解它们吗?或者,有人可以解释我的差异,并提供一个证明这种差异的基本例子吗?

2 个答案:

答案 0 :(得分:4)

使用waitpid()按顺序获取子进程的退出状态;使用wait()并不能保证检索子尸体的顺序。

在Unix上,退出状态限制为8位,可以通过检索数据的程序将其视为有符号或无符号。您还可以获得一个8位值,用于标识已终止子项的信号编号和核心转储状态。 AFAIK,状态或信号位始终为零(通常两者都是 - 当进程成功退出时)。

如果您不知道要返回的数字小于256,则退出状态不是可行的方法。正如其他人所说,在这种情况下你必须使用其他一些IPC。如果允许的唯一系统调用是那些,那么您必须得出结论,这些值将小于255,或者溢出无关紧要。作为家庭作业之外的结论,两者都不令人满意,但在“现实世界”中,您不仅限于4个系统调用。

另见Exit codes bigger than 255?。请注意,在Windows上,退出代码的范围要大得多 - 但您不使用问题中列出的系统调用。


观察:当我exit(1)时,来自wait()的状态值为256;这是有原因的吗?

答案:是的。状态字的低8位编码信号编号,依此类推; (16位)状态字的高8位编码退出状态。

请参阅<sys/wait.h>和宏WIFEXITED(),WEXITSTATUS()等。

答案 1 :(得分:1)

我认为你正在做的事情应该可以正常工作 - 只需将出现次数作为退出代码从流程中返回。

你提到exit()只允许低于256的数字。我非常怀疑是否是这种情况,但是你可以编写一个测试程序以确定是否足够简单。

听起来这只是Map-Reduce的简化版本。您可能想要查看该算法以及有关如何进一步并行化程序的一些想法 - 并且可能获得一些额外的功劳:)

至于wait()和waitpid()之间的区别 - 如果你只想等待任何子进程完成,你可以使用wait()。如果您只想等待特定的子进程,或者只是想检查子进程是否已经退出而没有挂起,那么您将使用waitpid()。