2016-10-23 4 views
1

私はこれを見ています。パイプで混乱します。 'cat -A'は出力の一部を除外しているようです。

cat test.hs |./TonHospel 
25 x 25 matrix, 8 threads 
permanent=-5258461839360 (0.213000 s) 
[email protected]:~/python$ cat test.hs |./TonHospel |cat -A 
25 x 25 matrix, 8 threads$ 

何らかの理由でcat -Aが出力の一部を除外しています。私はそれが何とかstderrとstdoutに関連するかもしれないと推測したので、私はstdoutに両方のパイプを試みました。これは役に立たなかった。

[email protected]:~/python$ cat test.hs |./TonHospel 2>&1 |cat -A 
25 x 25 matrix, 8 threads$ 

最後にランダムに試しました。

[email protected]:~/python$ cat test.hs |./TonHospel 3>&1 1>&2 2>&3 |cat -A 
25 x 25 matrix, 8 threads 
permanent=-5258461839360 (0.236000 s) 

何が起こっているのですか? C++のソースコードはhttps://bpaste.net/show/ce5ca8643ba5です。

+0

プログラムに応じてその出力を変更することができますstdoutが端末であるかどうか。 –

+0

'TonHospel'ではどうなりますか?それはリダイレクトされますか? –

+0

これはC++です。私はソースはhttps://bpaste.net/show/ce5ca8643ba5です。私はそれが何か変わったとは思わない? – eleanora

答えて

1

終了コードを単に返すのではなく、mainの末尾にquick_exitと呼んでください。 quick_exitは実行環境のクリーンアップに気を使わず、非常に危険です。特に、stdoutに関連するバッファをフラッシュしません。

stdoutは、端末に接続されている場合、ほとんどのシステムで使用されるため、ラインバッファされている場合は問題ありません。しかし、それがパイプに接続されているように、完全にバッファリングされていると、出力が失われる可能性があります。これは見ているものです。

これは、あなたのコードで唯一疑わしいプログラミングの練習ではありませんが、それは直ちに問題だと思います。

は(std::cout << std:::endl;が明示的coutバッファをフラッシュするための方法により、最初の行が正しく印刷されている。C++およびC出力機能をミキシングしかし、また、悪い考えである。)

0

TonHospelは、標準出力が端末であることを検出すると、標準エラーに追加の行(permanent=-5258461839360 (0.213000 s)など)を書き込みます。標準出力がパイプやファイルのようなものであれば、標準エラーには何も書き込まれません。

+0

このコードのどの部分を選択していますか? – eleanora

+0

それは別の質問のための問題です。いずれにしても、問題はコードそのものにあるのかどうかはわかりませんが、コンパイルやリンクされている可能性があります。これは、私の意見では 'iostream'と' stdio'の奇妙な組み合わせを使い、何とか 'printf'文が私が期待しているようにstderrではなくstdoutに書いています。実際のC++プログラマは、おそらく私が紛失していることを明らかにしているでしょう。 – chepner

+1

私はOPの* TonHospel *(AKA * permanent *)コードをダウンロードしてコンパイルし、 'echo foo | 。/ permanent'は2行を出力します。 'echo foo | ./permanent | wc -l'は* 1 *を返します。と 'echo foo | ./permanent>/dev/null'は* nothing *を出力します。これは、行のうちの1つが* stderr *に行くと奇妙に見えます。 – agc

関連する問題