Синхронизация родителя и потомка при использовании 2 каналов - PullRequest
1 голос
/ 20 марта 2020

Вот что должен делать мой код:

Ребенок должен:
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

Я предполагаю, что родительский элемент читает из канала перед тем, как дочерний элемент пишет в него, как исправить что?

1 Ответ

0 голосов
/ 20 марта 2020

Я предполагаю, что родитель читает из канала перед тем, как ребенок пишет в него, как это исправить?

Это предположение неверно. Это ошибка, о которой должен был предупредить хороший компилятор - вы пропустили, что не значения переменных c, received и test должны передаваться в write и 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));

Могу ли я спросить, как компьютер гарантирует, что сценарий, который я предположил, не произойдет?

read из канала, как и с терминалом устройство просто блокирует, пока не будет что прочитать (при условии, что дескриптор файла явно не был установлен как неблокирующий).

...