[英]reading and writing to a pipe c issue
這是程序:
int fd[2];
char buf1 [31];
int i;
char buf2;
pipe(fd);
if (fork() == 0) { // child
close(fd[1]); // close writing pipe
for(i = 0; i< 20; i++) {
read(fd[0], buf1, 30);
printf("%s\n", buf1);
}
close(fd[0]);
}
else { // parent
close(fd[0]); // close reading end
buf2 = 'a';
for (i = 0; i < 20; i++) {
write(fd[1], &buf2, sizeof(buf2));
}
close(fd[1]);
}
wait(NULL);
由於如果其中沒有任何內容,則讀取會阻塞,因此我們將首先寫入管道。
我的問題是關於寫功能。 for循環運行20次,每次將a
寫入管道時。 經過20次迭代后,寫入端的管道將包含aaaaaaaaaaaaaaaaaaaa
在孩子中,我將所有20個a's
都讀到buf1
,然后打印結果。
現在,既然我們已經寫完並閱讀了我們寫的內容,管道是空的嗎?
由於這里也有一個for循環,我們再次閱讀,但是這次,我認為管道是空的,因此沒有什么可讀取的。 所以我認為經過20次迭代的讀取后的最終輸出只是aaaaaaaaaaaaaaaaaaaa
但實際上是這樣的:
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaa
為什么? 閱讀后管道不為空嗎?
您是正確的,如果子級調用在父級寫任何東西之前先read
,則該調用會阻塞; 但是,在父級關閉文件描述符之后,情況就不再如此,並且read
將為EOF返回0。
read
調用不會清除緩沖區。 操作系統成功讀取零字符,因此更改了緩沖區的前零個字符。 也就是說,它根本不會改變buf1
。 因此,一旦所有數據都已讀入緩沖區, printf
調用將始終執行相同的操作。
請注意,您不能保證獲得此輸出。 很有可能子進程將在父進程的一些但不是全部的write
調用之后運行,在這種情況下,它將不會一次讀取所有20 a
並打印較短的字符串。 這就是為什么我在上面說過, 一旦讀取了所有數據 , printf
調用將始終執行相同的操作。 要處理未寫入所有數據的情況,應檢查read
的返回值。 如果它小於20,則您沒有將完整的字符串讀入緩沖區(並且應在目標指針提前的情況下再次調用read
,以免覆蓋數據)。 如果它為零,那么您已經到達文件末尾(寫結束已關閉); 如果為負,則有一個錯誤,您應該檢查errno
來處理它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.