没有嵌套的多个孩子?

时间:2015-10-01 13:47:16

标签: c process fork

我有一个班级的任务,我必须做3个子进程,每个进程都有自己的工作。父母要在创建下一个孩子之前等待每个孩子完成,然后父母要等待所有孩子完成才能打印自己的PID。我想知道的是,如果没有嵌套的if语句,这种多子进程是否可行。如果我需要超过3个子进程,如果我可以控制一个巨大的嵌套if语句之外的父进程。当我尝试将它们分成单独的if语句时,命令全部搞砸了。

基本上不是

"100000000,00"

我想要

if 
    child1
else
    if 
       child2
    else
       if
           child3

以下是我的作业的原始代码:

if
    child1
if
    child2
if
    child3
parent code here instead of nested

1 个答案:

答案 0 :(得分:2)

由于每个孩子都在做自己的一系列任务,你可以exit()和每个子块结束。

所以它看起来像这样:

pid = fork();
if (pid == -1) {
    perror("fork for child 1 failed");
    exit(1);
if (pid == 0) {
    // child 1 tasks
    exit(0);
}

waitpid(pid, &returnstatus, 0);

pid = fork();
if (pid == -1) {
    perror("fork for child 2 failed");
    exit(1);
} else if (pid == 0) {
    // child 2 tasks
    exit(0);
}

waitpid(pid, &returnstatus1, 0);

pid = fork();
if (pid == -1) {
    perror("fork for child 3 failed");
    exit(1);
} else if (pid == 0) {
    // child 3 tasks
    exit(0);
}

waitpid(pid, &returnstatus2, 0);

printf("Parent PID = %d\n", getpid());

另请注意对fork的调用的错误检查。

编辑:

如果你想要有点花哨并删除一些冗余代码,你可以使用一些函数指针:

#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>

typedef void (*child_func_type)(char *argv[]);

void child1_tasks(char *argv[])
{
    printf("Child 1 PID = %d\n", getpid());

    int a, b, c;
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = atoi(argv[3]);
    printf("Sum of integers = %d\n", a+b+c);
}

void child2_tasks(char *argv[])
{
    printf("Child 2 PID = %d\n", getpid());

    int a, b, c;
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = atoi(argv[3]);
    printf("Product of integers = %d\n", a*b*c);
}

void child3_tasks(char *argv[])
{
    printf("Child 3 PID = %d\n", getpid());

    int a, b, c;
    a = atoi(argv[1]);
    b = atoi(argv[2]);
    c = atoi(argv[3]);
    printf("Sum of squares of integers = %d\n", (a*a)+(b*b)+(c*c));
}

int run_child(char *argv[], child_func_type child_func)
{
    int returnstatus;
    pid_t pid;

    pid = fork();
    if (pid == -1) {
        perror("fork failed");
        exit(1);
    } else if (pid == 0) {
        child_func(argv);
        exit(0);
    }
    waitpid(pid, &returnstatus, 0);
    return returnstatus;
}

int main(int argc, char **argv) {

    if (argc != 4) {
        printf("Error:  Need 3 integer arguments\n");
        exit(1);
    }

    int returnstatus, returnstatus1, returnstatus2;

    returnstatus = run_child(argv, child1_tasks);
    returnstatus1 = run_child(argv, child2_tasks);
    returnstatus2 = run_child(argv, child3_tasks);

    printf("Children returned %d, %d, and %d\n", 
            returnstatus, returnstatus1, returnstatus2);
    printf("Parent PID = %d\n", getpid());

    return 0;
}