首页 > 解决方案 > 使用 2 个管道时同步父子节点

问题描述

这是我的代码的目的:

孩子应该:
1. 向父母发送一个字符
2. 从父母那里接收整数并打印它

父母应该:
1. 读取孩子发送的字符并打印
2. 将其转换为整数并将结果发送给孩子

这是我写的代码:

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

int main() 
{ 
    int fd1[2];  
    int fd2[2];  

    pid_t p; 

    if (pipe(fd1)==-1) 
    { 
        fprintf(stderr, "Pipe Failed" ); 
        return 1; 
    } 
    if (pipe(fd2)==-1) 
    { 
        fprintf(stderr, "Pipe Failed" ); 
        return 1; 
    } 

    p = fork(); 

    if (p<0) 
    { 
        fprintf(stderr, "fork Failed" ); 
        return 1; 
    } 


   if (p==0){
        char c='a';
      int received;
       close(fd1[0]);   
       write(fd1[1], c, sizeof(char)); 
       close(fd1[1]);

        close(fd2[1]);

       read(fd2[0], received, sizeof(int));
       printf("Printing from child ");
       printf(" ");
       printf("%d", received);
      close(fd2[0]);

   }

   if (p >0) 
    { 

      char received;
      close(fd1[1]);  

         read(fd1[0], received, sizeof(char));
         printf("Printing from parent ");
         printf(" ");
         printf("%c", received);

         close(fd1[0]);
         close(fd2[0]);

         int test=(int)received; 

        write(fd2[1], test, sizeof(test)); 
        close(fd2[1]); 

    } 

} 

我当前的输出如下:从父打印从子打印 0

我假设父母在孩子写入之前从管道中读取,如何解决这个问题?

标签: cpipefork

解决方案


我假设父母在孩子写入之前从管道中读取,如何解决这个问题?

这个假设是错误的。该错误是一个好的编译器应该警告的错误-您错过的不是变量的值creceived而是test必须传递给writeand read,而是它们的地址:

       write(fd1[1], &c, sizeof(char));
…
       read(fd2[0], &received, sizeof(int));
…
         read(fd1[0], &received, sizeof(char));
…
        write(fd2[1], &test, sizeof(test));

请问计算机如何确保我假设的情况不会发生?

与终端设备一样,来自管道的readfrom 只是阻塞,直到有东西要读取(前提是文件描述符没有显式设置为非阻塞)。


推荐阅读