Skip to main content
 首页 » 编程设计

c之从管道问题中读取

2026年05月17日15jirigala

我在管道上写入 10 个整数,所以我调用 write 10 次,然后我只想调用 read pipe 一次并将写入的整数存储到大小为 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."); 
    } 
} 

请您参考如下方法:

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

(1) 无法保证在父级尝试读取之前所有子级都已运行并写入管道。

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

解决这个问题的一种方法是让您的 parent 等待它的 child ,这样您就知道他们完成了,然后循环阅读,直到您阅读了您需要的所有内容。