管道不发送准确信息

时间:2016-05-22 10:53:54

标签: c linux pipe ipc

我已经开始使用烟斗进行基本练习。从进程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 个答案:

答案 0 :(得分:2)

问题在于

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

您正在使用读取操作接收的字节数覆盖您想要获得的值。

请确保不要通过分割行为s1s2分配新值

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

(和s2类似),它会起作用。