2016-05-22 2 views
0

Я начал использовать трубу для базового упражнения. Из процессов A и B получаем 2 случайных числа. Процесс C составляет сумму этих двух чисел, и он печатает его. Проблема в том, что я не получаю правильные значения от чтения. Значения, вводимые в трубе, не являются теми, которые выходят.Труба не отправляет точную информацию

В чем проблема?

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


int main(){ 

    int ac[2],bc[2]; 
    int f,g; 
    if(pipe(ac)<0 || pipe(bc)<0){ 
     perror("Pipe error"); 
     exit(1); 
    } 

    f=fork(); 

    if(f<0){ 
     perror("Error fork1"); 
     exit(2); 
    } 
    if(f==0){ 
     g=fork(); 
     if(g<0){ 
      perror("Error fork2"); 
      exit(3); 
    } 
    if(g==0){ 
      printf("We are in A \n"); 
      int variab=rand()%11+10; 
      printf("Here we found the number %d\n",variab); 
      write(ac[1],&variab,sizeof(int)); 
    } 
    else{ 
      wait(0); 
      printf("We are in B\n"); 
      int variab2=rand()%6+5; 
      printf("Here we found the number %d\n",variab2); 
      write(bc[1],&variab2,sizeof(int)); 
    } 
    } 
    else{ 
     wait(0); 
     printf("We are in C\n"); 
     int suma; 
     int s1=read(ac[0],&s1,sizeof(int)); 
     printf("S1=%d\n",s1); 
     int s2=read(bc[0],&s2,sizeof(int)); 
     printf("S2=%d\n",s2); 
     suma=s1+s2; 
     printf("Sum is %d\n",suma); 
    } 
    close(ac[0]); 
    close(ac[1]); 
    close(bc[0]); 
    close(bc[1]); 
    return 0; 
} 
+1

'int s1 = read (ac [0], & s1, sizeof (int));' это возможно? Не должно быть что-то вроде 'int s1; чтения (AC [0], & s1, SizeOf (INT)); '? –

+0

действительно, я был не осторожен, чем вы – Darkmer

ответ

2

Проблема с линиями

int s1=read(ac[0],&s1,sizeof(int)); 
... 
int s2=read(bc[0],&s2,sizeof(int)); 

Вы перезаписать значение, которое вы хотите получить с количеством байтов, полученных с помощью операции чтения.

Убедитесь, что не присвоить новое значение s1 и s2 разбивая линии

int s1; 
read(ac[0],&s1,sizeof(int)); 

(и аналогично с s2), и он будет работать.

+0

Большое спасибо – Darkmer

Смежные вопросы