2

オリジナルの Crowther/Woods FORTRAN Colossal Cave Adventure の 1991 C ポートをコンパイルしようとしています。コードはひどくごちゃごちゃしていますが、特定のセクションを変更すると、コンパイルして適切に実行されます。

問題は、その出力を別のプログラムまたはファイルにパイプしようとしても、何も表示されないことです。./adventure正常に動作しますが、./adventure | cat何も印刷されません。への呼び出しを grep しても、fstat何も表示されません。

プログラムがパイプを検出してサイレント モードに移行する他の方法はありますか? main 関数の最初の行として追加してもprintf("Hello World");、cat を通じて何も表示されません。

編集: Jim Gillogly のバージョンを使用していますが、ソースを取得したリンクが無効になっています。別のダウンロード リンクを見つけます。

4

2 に答える 2

3

既存のコメントが述べているように、stdout は端末に対して開かれなくなったため、おそらくブロック バッファリングされています。呼び出しを追加してみてください:

setvbuf(stdout, NULL, _IOLBF, 0);

番組冒頭のどこか。これにより、stdout が行バッファー モードに変更され、プログラムが改行を書き込むとすぐに出力がフラッシュされます。

于 2014-01-24T18:07:30.120 に答える
1

プログラムを変更する代わりに、Linux ではコマンド ラインからバッファー モードの変更を試すこともできますstdbuf(ただし、アプリケーション内の呼び出しは明らかにこれsetvbufをオーバーライドします)。たとえば、次のことを試すことができます。

stdbuf -oL ./adventure | cat

同様の効果は、unbuffer(付属expect) とを使用しても実現できscriptます。

于 2014-01-24T19:22:12.563 に答える