簡體   English   中英

unistd.h read()正在讀取更多數據然后被寫入

[英]unistd.h read() is reading more data then being written

我正在從命名管道讀取/寫入數據。 在寫方面,它表示正在寫一個恆定的110字節。 在大多數情況下,Reading表示讀取的是110個字節,而其他時候表示讀取的是220個字節或330個字節。 這是正確的,因為當我將其打印出來時,它會在同一read()中連續兩次或兩次打印出相同的消息。 在下面的閱讀代碼中,我是否使用memset清除char了嗎? 我想不出任何其他方式,除非緩沖區中遺留了一些東西,否則它正在被讀取。

int fd1, numread;
char bufpipe[5000];

    while(1)
    {
        fd1 = open("/tmp/testPipe", O_RDONLY);
        numread = read(fd1,bufpipe, 5000);//->this should always be 110
        if(numread > 1)
        {
            printf("READ: %i", numread); 
            bufpipe[numread+1] = '\0';
            memset(bufpipe,'\0',5001);
            close(fd1);
        }
    }

這個:

memset(bufpipe,'\0',5001);

被一個字節覆蓋,因為您只有5000個字節。

但是主要的“問題”是read(..., 5000)始終會讀取多達5000個字節的內容-您似乎假設它只能讀取與編寫者一次寫入的內容一樣多的內容。 ,這是不正確的。 如果寫入器在兩次讀取之間寫入兩個110字節的數據包,那么讀取器讀取220字節是完全正確的。

如果您一次只需要讀取一個數據包,則必須使數據包自描述。 因此,例如,前四個字節包含要跟隨的字節數。 然后,您可以通過讀取四個字節,將其轉換為整數,然后讀取該數量的數據字節來讀取單個數據包。

您認為write后將立即執行read假設是不正確的。 在遇到讀取之前,編寫器進程可能會多次寫入管道。 寫入的數據將被添加到緩沖區的末尾。 換句話說,讀取和寫入不是面向數據包的。 它們是面向流的。 這意味着write只會將數據添加到緩沖區,而read只會獲取可用的任何內容。

您如何與作者同步? 您只需要閱讀您的期望(將110指定為read()即可)

暫無
暫無

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

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