首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解读管道问题

解读管道问题
EN

Stack Overflow用户
提问于 2013-11-23 18:02:06
回答 2查看 97关注 0票数 0

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

代码语言:javascript
复制
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.");
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-23 18:37:18

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

(1)在家长尝试阅读之前,不能保证你所有的孩子都已经跑到管道上去了。

(2)即使(1)确实发生,也不能保证你的读取将在一次读取中返回所有10个整数。read可以(而且经常会)返回比您所要求的少。

解决这一问题的一种方法是让您的父wait在其子wait上,这样您就可以知道他们已经完成了,然后在循环中阅读,直到您阅读了所需的所有内容。

票数 1
EN

Stack Overflow用户

发布于 2013-11-23 18:37:29

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20165890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档