簡體   English   中英

從管道閱讀

[英]Reading from pipe issue

我在管道上寫10個整數,所以我叫write 10次,然后我想只調用一次read管道,然后將寫入的整數存儲到大小為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可能(而且經常會)返回的結果少於您的要求。

解決這個問題的一種方法是讓您的父母wait孩子,以便您知道他們已經完成,然后循環閱讀直到您閱讀所需的所有內容。

http://linux.die.net/man/2/read讀取返回可用數據,而不是請求的數量,使用周期並檢查每次迭代的返回值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM