父子之间通过管道进行通信

communication between parent and child through pipe

我想要一个亲子对话的节目。 所以输出将是:

等等……

下面是一个代码示例,其中输出首先与父对话,然后是子对话。 我怎样才能更正代码?

    for(int i=0; i<N; i++){
            pid=fork();
            if(pid==-1){
                    perror("fork\n");
                    exit(EXIT_FAILURE);
            }
            else if(pid==0){
                    srand(time(NULL));
                    int c;
                    read(fd[i][0], &c, 1);
                    printf("c: value: %d\n", c);
                    char word[c];
                    read(fd[i][0],&word, sizeof(word));
                    printf("c: word: %s\n", word);
                    int sum;
                    sum=c*i;
                    write(fd[i][1], &sum, sizeof(int));
                    printf("c: sended %d\n", sum);
                    int flag=0;
                    printf("flag :%d\n", flag);
                    read(fd[i][0], &flag, sizeof(int));
                    printf("c: flag= %d ->exit\n", flag);
                    exit(1);
            }else{
                    int c;
                    c=rand()%100+1;
                    write(fd[i][1], &c, sizeof(int));
                    printf("p: value: %d\n", c);
                    char word[c];
                    write(fd[i][1], &word, sizeof(word));
                    printf("p: word: %s\n", word);
                    int sum;
                    read(fd[i][0], &sum, sizeof(int));
                    printf("p: sum is: %d\n", sum);
                    int flag=1;
                    write(fd[i][1], &flag, sizeof(int));
                    printf("par: flag exit %d\n", flag);
                    wait(NULL);
            }
    }

要在两个进程之间进行双工通信,您需要两个个管道:

  1. 一个用于parent到child的通信;
  2. 还有一个用于child到parent的通信

如果你对两者使用相同的管道,那么你可能会遇到类似 child 的情况,向管道写入一些东西,然后直接再次读回(并且 parent 将永远看不到数据)。

例如,这可能发生在

write(fd[i][1], &sum, sizeof(int));
// ...
// Could read sum that was written just above in the same process
read(fd[i][0], &flag, sizeof(int));

在您的 child 过程中。

对于上面显示的 writeread 调用的示例,您可以使用如下内容:

int parent_to_child[2];  // Pipe where parent process write and child reads
int child_to_parent[2];  // Pipe where parent process reads and child writes

pipe(parent_to_child);
pipe(child_to_parent);

// ...

pid = fork();
if (pid == 0)
{
    // Other code...

    // Child writes to parent
    write(child_to_parent[1], &sum, sizeof(int));

    // Child reads from parent
    read(parent_to_child[0], &flag, sizeof(int));

    // ...
}
else
{
    // Other code...

    // Parent reads from child
    read(child_to_parent[0], &sum, sizeof(int));

    // Parent writes to child
    write(parent_to_child[1], &flag, sizeof(int));

    // ...
}