【问题标题】:Correct usage of fork, wait, exit, etc正确使用fork、wait、exit等
【发布时间】:2023-03-12 21:11:01
【问题描述】:

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

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

【问题讨论】:

  • 请输入输出样例。取一个维度为 3x5 的数组,其中 3 = 行数,5 = 为简洁起见的整数数。
  • 如果您需要在进程之间进行通信并且无法使用退出代码,您将不得不研究其他形式的 IPC。考虑管道(可能通过 popen)。
  • 您可以将数字写入文件,还是可以使用 STDIN/OUT 在进程之间进行通信?
  • 1) exit() 接受一个 int(即不限于 0-255)。当您调用 wait(int *status) 并且您的子进程正常退出时,这是否会正确反映在您的主进程中?
  • @Brian Agnew:在 Unix 上,退出状态限制为 8 位。您从 wait() 或 waitpid() 获得 16 位状态,但其他 8 位编码信号编号和核心转储状态。 16 位字的一半总是零位。

标签: c process fork system-calls


【解决方案1】:

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

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

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

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


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

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

<sys/wait.h>和宏WIFEXITED()、WEXITSTATUS()等

【讨论】:

  • 那我得问问老师他想做什么......不过,就像我在另一条评论中所说的那样,如果我退出(1),退出(2),退出( 4) wait(int status) 的状态值实际上分别是 256、512、1024,有什么原因吗?
【解决方案2】:

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

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

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

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

【讨论】:

  • 在 Unix 上,提问者是正确的 - 退出状态是一个 8 位值(有时被视为有符号,有时被视为无符号,具体取决于程序)。
  • 是的,刚刚在 Google 上搜索过,各种页面都报告了相同的结果,我只能返回 0-255 的值,我也只是测试了这个,由于某种原因,如果我返回 1,它实际上返回了 256, 2 = 512, 4 = 1024, 不知道为什么...此外,在这方面根本没有学分,我需要知道并理解这对于几周后的期末考试是如何工作的,会有类似的问题.
  • @Jonathan - 对 8 位状态码很感兴趣。假设有这种限制,我想不出任何其他方式在问题的约束范围内将信息从子进程传递到父进程。
猜你喜欢
  • 2013-10-06
  • 1970-01-01
  • 2020-06-18
  • 1970-01-01
  • 2015-03-30
  • 1970-01-01
  • 2014-04-21
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多