阅读管道问题

时间:2013-11-23 18:02:06

标签: c linux unix

我正在写一个10个整数的管道,所以我调用了10次写入然后我只想调用一次读取管道并将写入的整数存储到一个大小为10的数组中,之后将数组中的所有整数添加到总和。问题是我读完后只得到9个整数。我做错了什么?

int main()
{
    int fd[2];
    int total = 0;
    int result;
    int nbytes;
    int child;
    int subVector;
    int written;
    static int readSum[P];
    int partialSum;
    if(pipe(fd) < 0){
        perror("pipe");
    }

    for(child = 0; child < P; child++){
        if((pid[child] = fork()) < 0){
            perror("fork");
            exit(1);
        }
        else if(pid[child] == 0){
            close(fd[0]);
            partialSum = getSubvectorSum(elementsList,child,P,SIZE);
            //printf("Partial sum: %d by child #%d\n",partialSum,getpid());
            written = write(fd[1],&partialSum,sizeof partialSum);
            //printf("Child #%d has written: %d bytes.\n",getpid(),written);
            if(written == 0){
                printf("Writting not performed.");
            }
            close(fd[1]);
            exit(0);
        }
    }

    close(fd[1]);
    int status = 0;

    nbytes = read(fd[0],&readSum,sizeof readSum);
    printf("Parent reads %d bytes\n",nbytes);
    if(nbytes > 0){
        for(child =0;child<P;child++){
            total += readSum[child];
            printf("Partial sum in father: %d\n",readSum[child]);
        }
    }
    else{
        printf("Failed to read.");
    }
}

2 个答案:

答案 0 :(得分:1)

你忽略了圣人滚石乐队的智慧,并不接受你不能总是得到你想要的东西,但有时你会得到你需要的东西。

(1)在父母试图阅读之前,无法保证所有孩子都已经跑完并写入管道。

(2)即使(1)确实发生了您的读取将在一次读取中返回所有10个整数,也无法保证。 read可以(通常会)回报少于你要求的回报。

解决此问题的一种方法是让您的孩子的父母wait让您知道他们已经完成,然后循环阅读,直到您阅读了所需的一切。

答案 1 :(得分:0)

http://linux.die.net/man/2/read 读取返回可用数据,而不是请求的数量,使用周期并检查每次迭代的返回值。