如何在C中正确fork()n子进程?

时间:2012-02-05 10:59:01

标签: c fork

这是我的代码。

#include <stdio.h>
#include <stdlib.h>

int main ( int argc, char *argv[] )
{
    int i, pid;

for(i = 0; i < atoi(argv[1]); i++) {
    pid = fork();
    if(pid < 0) {
        printf("Error");
        exit(1);
    } else if (pid == 0) {
        printf("Child (%d): %d\n", i + 1, getpid());
        exit(0); 
    } else  {
        wait(NULL);
    }
}

}

输出就是这样。

Child (1): 5676
Child (2): 4624
Child (3): 4800
Child (4): 5596
Child (5): 5580

然而,这不是我作业中的预期输出。 它应该是那样的。代码有什么问题?有人能帮助我吗?

Child (2): 4625
Child (1): 4624
Child (3): 4626
Child (4): 4627
Child (5): 4628

感谢您的帮助。现在我会尝试一下。

P.S。对不起,我的英语不好。我希望你能理解我说的话。

4 个答案:

答案 0 :(得分:5)

您的代码在我的计算机上完美运行。它可能依赖于os。

但是如果没有为你的程序提供参数,你应该检查argc是否不等于1以避免分段错误。

答案 1 :(得分:1)

系统将免费PID分配给进程。您可以将进程ID分配4000并且子ID为3900.您的作业文件甚至不应该放数字,因为无论如何第一个进程ID永远不会相同。

答案 2 :(得分:1)

您获得无序输出的原因是您无法准确预测哪个孩子何时变为活动状态。因此,可能会发生第一个孩子的执行被延迟,直到第二个孩子被fork()编辑并开始。

您的孩子通常会获得顺序PID,尽管这取决于操作系统。

这两个问题都不应该是你的计划任务的问题 - 绝对的PID都不是很重要(如上所述,每个操作系统都可以做自己的事情,顺序或随机分配PID),也不是孩子们的顺序做他们的事情:孩子的每个部分可以有不同的执行时间,导致无序的输出。只要数据正确传输,就会计算 - 如果父级生成序列然后分叉,则会出现这种情况。在这种情况下,子进程的内存布局与fork时的父进程相同。因此父母可以修改其“数据传输数组”,而不会影响已经运行的子代。

为了减少混淆,您可以删除每行中PID的输出。也许它们可以在子进程的相应开始时输出,但在那之后,它应该足以说明例如Child 3: straight length 6 <S6,H5,C4,S3,H2,SA>,不重复PID。

答案 3 :(得分:1)

根据预期的输出,你的作业很可能应首先分出所有进程,然后再等待。

只需跳过循环中的等待调用,然后在下面单独执行一次,直到wait返回-1并将errno设置为ECHILD为止。请注意,子项的输出顺序将是随机的,或者至少不完全按顺序排列,因此不一定是2 1 3 4 5.

这只是猜测,如果你想要更具体的答案,你应该提供更多信息。