[英]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.