
\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
答え2
次のサイクルに従います。
while((ch=getchar())!=EOF)
{
write(p[1],&ch,1);
}
そして:
char carriageReturn = 0x0D;
write( p[1], &carriageReturn, 1 );