我有这个流程图,我必须做代码源! 请检查是否正确
这是我的解决方案
A)
#include <unistd.h>
int main(void) {
int i;
for (i= 0; i < 3; i++)
{
if(!fork())
break;
}
while(wait(NULL) !==-1);//to avoid the appearance of zombies processes??
第二个解决方案b):
#include <unistd.h>
int main(void) {
int i,pid;
for(i=0; i<3;i++)
{
pid=fork();
if (pid>0)
break;
}
while(wait(NULL)!=-1);
PS:我还要包括评论,以表明我必须包含每个孩子的“”执行“”?
答案 0 :(得分:2)
在这两个程序中,您需要合理化缩进,并在末尾包含缺少的括号。
解决方案(a)或多或少是正确的。我们可以争论wait()
vs waitpid()
的选择,您应#include <sys/wait.h>
声明您使用的等待函数。你还没有表明你会在exec()
做什么,这意味着我们不能说你是否遇到了等待零孩子的子进程的问题 - 这是笨拙的,但不会影响正确性。 (就个人而言,我写if (fork() == 0)
因为我认为它比!fork()
更清晰,特别是因为返回值0表示进程成功分叉,而!fork()
读取'not fork',可能很容易意味着'没有叉'。
解决方案(b)也或多或少是正确的,除了exec()
的位置不同,如果fork()
失败,你将执行比你想要的更长的循环,但同样不太可能成为一个重大问题。主要问题是“流程如何判断它是原始的还是其中一个孩子”?您尚未显示区分原始进程和各种子进程所需的控制信息。此外,如果您要设置管道或其他任何东西,则不会显示。