如何分叉n个孩子并让他们在C中执行不同的任务?

时间:2015-09-12 08:21:39

标签: concurrency fork

我试图从父母创建4个子进程,让每个孩子执行不同的事情。

int main(void) {
int processes = 4;
int i;
for (i = 1; i <= processes; i++) {
    if (fork() == 0) {
        printf("pid: %d\n", getpid());
        exit(0);
    }
}
int status;
for (i = 1; i <= processes; i++)
    wait(&status);
}

现在输出产生了     pid:5847     pid:5846     pid:5845     pid:5844

为什么pid会减少而不是增加订单?我没有正确使用fork()创建子项吗?

1 个答案:

答案 0 :(得分:0)

这是一种视错觉。 PID按顺序递增;)让我解释一下:

  • 首先,创建过程5844
  • 然后创建过程5845
  • 然后创建过程5846
  • 然后创建过程5847
  • 然后OS调度程序选择进程5847并打印&#34; 5847&#34;
  • 然后OS调度程序选择进程5846并打印&#34; 5846&#34;
  • 然后OS调度程序选择进程5845并打印&#34; 5845&#34;
  • 然后OS调度程序选择进程5844并打印&#34; 5844&#34;

您无法控制调度程序首先选择哪个进程。但是,如果您在sleep(1);循环的末尾添加for,我确定PID将按递增顺序排列(除非您达到上限并且它们会回绕。)

至少Linux和OS X按顺序生成PID,不了解其他类Unix操作系统。

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

int main(void) {
    int processes = 4;
    int i;
    int fork_result;
    int number_of_children;
    for (i = 1; i <= processes; i++) {
        fork_result = fork();
        if (fork_result > 0) {
            printf("parent says: hello child #%d, how are you?\n", fork_result);
            number_of_children++;
        } else if (fork_result == 0) {
            printf("pid: %d\n", getpid());
            exit(0);
        } else if (fork_result < 0) {
            printf("parent says: fork() failed\n");
        }
    }
    int status;
    for (i = 1; i <= number_of_children; i++) {
        wait(&status);
    }
}

在我的系统(OS X 10.10.5)上打印:

parent says: hello child #2577, how are you?
parent says: hello child #2578, how are you?
pid: 2577
pid: 2578
parent says: hello child #2579, how are you?
parent says: hello child #2580, how are you?
pid: 2579
pid: 2580

您使用的操作系统是什么? &#34;父母说:&#34;在任何情况下,行都应按递增顺序排列。