c -如何在c中多次将变量从父进程传递到子进程,然后返回到父进程,再传递到同一个子进程等?

pkln4tw6  于 2023-02-21  发布在  其他
关注(0)|答案(3)|浏览(170)

我是一个初学者,我还在开始学习C语言中的叉和管道。
我试图创建一个创建一个父进程和一个子进程,重复传递变量给对方。
parent 1发送a,B --〉child 1计算a+b=c --〉parent 1接收c并计算c * 10000=X,然后发送p,q --〉child 1计算p+q=s--〉parent 1接收s,计算s * 10000=Y --〉退出父子进程--〉系统计算X+Y=Z并返回Z
我知道如何不断地分叉并获得相同的父进程但不同的子进程。我基本上多次重复下面的代码来打开新的管道和分叉(pid 1,pid 2,pid 3,pid 4等和port 1,port 2,port 3,port 4等),所以父进程是相同的,但创建了新的子进程。

int port1[2];
    if (pipe(port1) == -1){
        printf("Error occurred with opening first pipe.");
        return 1;
    }
    int pid1 = fork();
    if (pid1 == 0){
        close(port1[0]);
        c = a+b;
        if (write(port1[1], &c, sizeof(c)) == -1){
            printf("Error occurred writng to the pipe.");
            return 2;
        }
        close(port1[1]);
        exit(EXIT_SUCCESS);
    }

    else{
        close(port1[1]);
        read(port1[0], &c, sizeof(c));
        X = c * 10000;
        close(port1[0]);
    }

但我怎么能多次从父母传给同一个孩子呢

yws3nbqq

yws3nbqq1#

我预计将代码分成函数会对你有很大帮助(通常情况下也是如此)。特别是,我建议为通信的父端和子端编写单独的函数。这将使代码更清晰,从而更容易编写和阅读。
这个框架应该是这样的:

void do_child_things(int in_fd, int out_fd) {
    // read parent messages from in_fd and write responses to out_fd ...
}

void do_parent_things(int in_fd, int out_fd) {
    // write child messages to out_fd and read responses from in_fd ...
}

// ...

void some_function(void) {
    // One pipe for each direction
    int parent_to_child[2];
    int child_to_parent[2];

    pipe(parent_to_child);
    pipe(child_to_parent);

    // fork ONCE, since you want only one child
    pid_t child_pid = fork();

    // Close unneeded pipe ends and call the appropriate behavior

    // In the child
    close(parent_to_child[1]);
    close(child_to_parent[0]);
    do_child_things(parent_to_child[0], child_to_parent[1]);
    // and terminate
    exit(0);

    // ...

    // In the parent
    close(parent_to_child[0]);
    close(child_to_parent[1]);
    do_parent_things(child_to_parent[0], parent_to_child[1]);
    // and wait for the child to terminate
    int child_status;
    waitpid(child_pid, &child_status, 0);
}

您必须决定交换消息的具体形式,但是您有很多选择。如果您不想处理低级别的read()write(),那么您可以使用fdopen()来获取管道末端的流接口,您可以使用fprintf()fscanf()fgets() * 等 *。这可能会让您更舒服。不过,在这种情况下,请注意,您可能需要在每个消息之后对输出流进行fflush()

bis0qfac

bis0qfac2#

1.函数call_child(wp,rp,x,y)
1.将x和y写入管道。
1.从管道读取结果。
1.计算修改后的结果。
1.返回修改结果。
1.创建管道。
1.叉子。
1.如果是孩子,
1.关闭相应的管端。
1.回路,
1.从管道中读取两个值。
1.如果EOF,
1.脱离循环。
1.计算总和。
1.将结果写入管道。
1.出去。
1.关闭相应的管端。
1.使用管道符a和b调用call_child
1.打印返回值。
1.使用管道符p和q调用call_child
1.打印返回值。
1.关闭其余管端。
1.等待孩子。

tjvv9vkg

tjvv9vkg3#

在程序开始时分叉一次,然后在每个分支内循环。

相关问题