我有一个问题要解决,我不知道怎么做,因为只有几个系统调用,我们可以用来解决它,我不知道他们如何有助于这种情况。
练习:
我有一个带整数的矩阵,其大小为[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()
之间的区别以及如何/在哪里使用它们。除了手册页之外,还有没有更多的文档可以让我看到代码示例,以便更好地理解它们?或者有人能给我解释一下这些差异并提供一个基本的例子来说明这些差异吗?
最佳答案
使用waitpid()
以顺序排列子进程的退出状态;使用wait()
不能保证将检索儿童尸体的序列。
在UNIX上,退出状态被限制为8位,可以通过检索数据的程序将其视为已签名或未签名。您还将得到一个8位值,用于标识终止子级的信号号和核心转储状态。AFEK,无论是状态还是信号位总是零(通常是两个-当进程成功退出)。
如果你不知道要返回的数字小于256,那么退出状态就不可能了。正如其他人所说,在这种情况下,您必须使用其他IPC。如果只允许那些系统调用,那么您必须得出结论,这些值将小于255,或者溢出无关紧要。在家庭作业之外,这两个结论都不令人满意,但在“现实世界”中,您也不限于4个系统调用。
另请参见Exit codes bigger than 255?。请注意,在Windows上,退出代码的范围要大得多,但是您不使用问题中列出的系统调用。
观察:当我执行exit(1)
时,wait()
的状态值是256;这是有原因的吗?
回答:是的。状态字的低8位编码信号号等;(16位)状态字的高8位编码退出状态。
请参见<sys/wait.h>
和宏WIFEXITED()、WEXITSTATUS()等。
关于c - 正确使用fork,wait,exit等,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/774048/