我已经开始用烟斗做基本练习了。从过程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;
}

最佳答案

问题在于线路

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类似)它将工作。

关于c - 管道未发送准确的信息,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37373412/

10-15 02:17