如何 运行 多个 children 执行不同的任务?

how to run multiple children with different tasks?

我的程序必须创建多个 children,我从终端获取 children 的数量。然后,我需要将它们分组,每个组都有不同的任务。

我创建了children,但问题是我不能给他们单独的任务,我无法区分children。我唯一能做的就是,每个 children 都在同一部分工作(比如打印 pids)。

如何将他们分开并分配给他们特定的任务?

例如,前 4 个 children 应该调用一个函数,其他 3 个应该打印一些东西,另外 3 个应该写入一个文件等。

    pid_t pid[10];

    pid[0] = fork();
    if(pid[0] > 0)
    {
        for(int i = 0; i < 9; i++)
        {
            if(pid[i] > 0)
            {
                pid[i + 1] = fork();
            }
        }
    }

    for(int i = 0; i < 10; i++)
    {   
        if(pid[i] == 0)
        {
            printf("child %d, parent %d\n", getpid(), getppid());
            exit(1);
        }
    }

我认为您应该看一下 fork() 函数的工作原理。这是 man page, here a useful answer and here a useful tutorial.

当您在代码中使用 fork() 时,要知道子进程从父进程所在的位置继续。因此,当您在第一个 for 循环中调用 fork() 时,所有子进程都会继续父进程已经开始的循环。我认为这不是您期望的行为。

无论如何,这里有一个可能解决您的问题的方法。通过这种方式,您的流程会做一些分成小组的事情。请注意工作结束时的 exit(0) 函数。重要的是要确保每个进程只做它的工作而不是它父进程的工作:

pid_t pid[10];

for (int i = 0; i < 9; i++)
{
    pid[i] = fork();

    //First group            
    if (pid[i] == 0 && i < 4){
        //Insert here the code for the first group or call a fuction
        exit(0);
    }

    //Second group
    if (pid[i] == 0 && i >=4 && i < 8){
        //Insert here the code for the second group or call a fuction
        exit(0);
    }

    //Third group
    if (pid[i] == 0 && i >=8){
        //Insert here the code for the third group or call a fuction
        exit(0);
    }

    if (pid[i] < 0){
        perror("Something wrong with the fork");
        exit(1);
    }
}
int flag = 0;
flag |= (fork() == 0) << 0;
flag |= (fork() == 0) << 1;
flag |= (fork() == 0) << 2;
printf("this process works on problem %d\n", flag);