/ / C - 標準入力、UNIXパイプラインおよびEOF - c、パイプ、c99

C - stdin、unixパイプラインとEOF - c、パイプ、c99

私は最初に受け取るアプリケーションを書いていますUNIXパイプラインからのデータを入力し、ユーザーに入力を求めます。理解できないように思われるのは、ユーザーに入力を求める前にパイプラインからの入力が正しく閉じられないように見える理由です。ここにはとても基本的なものが欠けているようです。

私は提示されたstdinをフラッシュするためのすべての例を試してみました ここに 成功なし。 この また、潜在的に関連があるように思われますが、私は関連する答えを抽出することができませんでした。

#include <stdio.h>
#include <stdlib.h>

#define BUFSZ 1024

int main(void) {

char *buf = calloc(BUFSZ, sizeof(char));

while(fgets(buf, BUFSZ, stdin)) { printf("Pipe input: %s", buf); }

printf("Enter input: ");
fgets(buf, BUFSZ, stdin);
printf("User input: %s", buf);

free(buf);
return 0;
}

使用例と出力例

$ cat testdata2 | ./a.out
Pipe input: testdata testdata
Pipe input: testdata testdata2
Pipe input: testdata testdata3
Pipe input: testdata testdata4
Pipe input: testdata testdata5
Pipe input: testdata testdata6
Pipe input: testdata testdata7
Enter input: User input: testdata testdata7
$

2番目のfgets()(キーボード入力用)がバッファに触れないようにするにはどうすればよいでしょうか。

このMCVEはOSXとLinuxでテストされコンパイルされたものと同じ結果です。

回答:

回答№1は5

もし stdin それからパイプです stdin 端末ではありません。あなたがパイプの終わりに着くとき、それはそれであります!それはの終わりです stdin。あなたは「ある種の魔法の変革を期待しています。 stdin パイプであることをやめて何かであり始めるそうでなければ。それを期待しないでください。それはまだパイプです。そしてEOFが発生しました。パイプの場合、EOFは恒久的な状態です。あなたが「EOFを打ったならば、あなたはこれまでに何も得られない」。

の戻り値を確認してください fgets すべて 時間。 EOFにあるので、最後のものがnullを返すことがわかります。

パイプで読みたいプログラム stdin また、キーボード入力で端末を別に開く必要があります。 FILE *tty = fopen("/dev/tty", "r");