3

より大きな実際のプログラムで問題をテストするために、単純な I/O エコー プログラムを C で作成しました。ここでは、Linux FD リダイレクトが機能しません。

エコー プログラム (別名a.out) は次のとおりです。

#include <stdio.h>

int main(int argc, char **argv) {
  char buff[10];
  while (1) {
    if (fgets(buff, 10, stdin) == NULL) break;
    printf("PRINT: %s \n", buff);
  }
}


Bash から、次のように実行します。

$ mkfifo IN OUT
$ # this is a method to keep the pipes IN and OUT opened over time
$ while :; do read; echo Read: $REPLY >&2; sleep 1; done <OUT >IN &
$ a.out >OUT <IN &

$ echo xyz >IN

出力は生成されwhileません。Bash ループは から読み取ることができませんOUT


この a.out を と比較してみましょうcat。代わりに期待どおりに動作します。

$ mkfifo IN OUT
$ while :; do read; echo Read: $REPLY >&2; sleep 1; done <OUT >IN &
$ cat >OUT <IN &

$ echo xyz >IN
Read: xyz

この最後の行は、コンソールの stderr に出力されます。 catの出力は、a.out の出力とは異なりOUT、Bashwhileループを通過して到達し、コンソールに表示されます。
a.out の何が問題になっていますか?

4

1 に答える 1

5

fflush(stdout)の後に追加してみてくださいprintf(...)

于 2012-09-21T14:57:06.833 に答える