猫はいつパイプからデータを読み取るのですか?

猫はいつパイプからデータを読み取るのですか?

\n次のコードが与えられた場合、catはなぜCTRL+を入力した後にのみパイプの内容を印刷しますかD?猫が読んだ内容を実際に印刷するにはどのような条件が必要ですか?

#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;
}

ベストアンサー1

catこれはパイプやバッファリングには関係ありません。あなたの「問題」は最終デバイスの上流です。

ターミナルキーボードに入力したすべての文字をアプリケーションからすぐに読み取ることができる場合に入力するcatと、aBackspacebReturnアプリケーションは次に読みます。aこれは^?あなたが望むものではなく、得ることもできません。b^M

あなたが望んでいるものはそれを読むだけですa^J

基本的にこれを取得します。モデルモード、ターミナルデバイスドライバ(ttyライン規律)はラインエディタテキストを入力して編集できます(制限機能)。入力したテキストは、を押したときにのみ読み取ることができますReturn

これを回避するには、エンドデバイスにこの設定を維持するように指示できます。モデルモデル。たとえば、実行するとstty rawアプリケーションが表示され、cat文字はすぐに表示されますが、動作は期待したものと異なる場合があります。

また、他のタイプの入力(パイプなど)の場合、文字が到着するとすぐに次のように出力されることもわかります。

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

おすすめ記事