下面是程序:讀取和寫入到一個管道ç問題
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()'的返回值(正確)來確定終止符應該去哪裏,那麼你就不會感到困惑。 –
@JohnBollinger這取決於;這不是一個MCVE,所以我們不知道'buf1'聲明在哪裏以及如何發生。如果它是靜態的而不是在'main'中發生,或者如果它有一個未包含在這裏的初始化,那麼其餘的字符都是0,它是安全的。如果所有這些都在'main'中,那麼是的,這可能是一個問題。 –