0

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

练习:
我有一个大小为 [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()如何/在哪里使用另一个。除了手册页之外,是否还有更多文档可以让我查看代码示例等以便更好地理解它们?或者有人可以向我解释这些差异并提供一个证明这种差异的基本示例吗?

4

2 回答 2

4

用于waitpid()依次获取子进程的退出状态;usingwait()不能保证检索子尸体的顺序。

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

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

另请参阅大于 255 的退出代码?. 请注意,在 Windows 上,退出代码的范围要大得多 - 但您不使用问题中列出的系统调用。


观察:当我这样做时exit(1),状态中的wait()值为256;这有什么原因吗?

回答:是的。状态字的低 8 位编码信号号等;(16 位)状态字的高 8 位编码退出状态。

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

于 2009-04-21T19:54:02.537 回答
1

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

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

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

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

于 2009-04-21T19:36:15.623 回答