Pipe
cat 什麼時候完成從管道中讀取的內容?
給定以下程式碼,為什麼 cat 只在我輸入
\n
或CTRL
+後列印管道的內容D
?cat 實際列印所讀內容的條件是什麼?#include <stdio.h> #include <stdlib.h> #include <unistd.h> int main(void){ int pid,p[2]; char ch; pipe(p); if((pid=fork()) == -1){ fprintf(stderr,"Error:can't create a child!\n"); exit(2); } if(pid){ close(p[0]); while((ch=getchar())!=EOF){ write(p[1],&ch,1); } close(p[1]); wait(0); }else{ close(p[1]); close(0); dup(p[0]); close(p[0]); execlp("cat","cat",NULL); } return 0; }
cat
這與管道或緩衝無關。您的“問題”在終端設備的上游。如果您在終端鍵盤上輸入的每個字元都可供您的應用程序立即讀取
cat
,那麼您是否輸入a``Backspace``b``Return
,您的應用程序將讀取a
then^?
thenb
then^M
,這不是您想要的,也不是您得到的。您想要並得到的是它可以閱讀
a^J
。您會得到它,因為在預設規範模式下,終端設備驅動程序(tty 行規則)實現了一個行編輯器,可讓您輸入文本並對其進行編輯(功能有限),並且您輸入的文本僅在您閱讀時可用按
Return
。為避免這種情況,您可以告訴終端設備離開該規範模式。例如,通過執行
stty raw
, 您將看到您的應用程序並cat
立即獲取字元,但可能行為不是您所期望的。您還會注意到,對於其他類型的輸入,例如管道,字元一到達就會輸出,如下所示:
(printf x; sleep 1; echo y) | that-command