より大きな実際のプログラムで問題をテストするために、単純な 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 の何が問題になっていますか?