Pipe

cat 什麼時候完成從管道中讀取的內容?

  • May 8, 2015

給定以下程式碼,為什麼 cat 只在我輸入\nCTRL+後列印管道的內容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,您的應用程序將讀取athen ^?then bthen ^M,這不是您想要的,也不是您得到的。

您想要並得到的是它可以閱讀a^J

您會得到它,因為在預設規範模式下,終端設備驅動程序(tty 行規則)實現了一個行編輯器,可讓您輸入文本並對其進行編輯(功能有限),並且您輸入的文本僅在您閱讀時可用按Return

為避免這種情況,您可以告訴終端設備離開該規範模式。例如,通過執行stty raw, 您將看到您的應用程序並cat立即獲取字元,但可能行為不是您所期望的。

您還會注意到,對於其他類型的輸入,例如管道,字元一到達就會輸出,如下所示:

(printf x; sleep 1; echo y) | that-command

引用自:https://unix.stackexchange.com/questions/202113