• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:リダイレクトとパイプについて教えてください。)

リダイレクトとパイプについて教えてください

このQ&Aのポイント
  • リダイレクトとパイプは、コンソールプログラムの出力を操作するための方法です。
  • リダイレクトを使用すると、プログラムの出力をファイルにリダイレクトすることができます。
  • パイプを使用すると、複数のプログラムを連結して実行し、1つのプログラムから出力されたデータを別のプログラムに渡すことができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.6

コンソール直出力の場合はバッファが無いので、即座に 表示されます。リダイレクトすると、出力先がファイル なので、バッファリングされます。 パイプの場合はAPIでやると分かるのですが、ファイルと 同じ扱いになります。(1度のOpen、正しくはCreateで 入力と出力の2個のハンドルができる所が異なる)つまり、 バッファリングされます。 デバイスの種類からみると、コンソールはキャラクタ型の デバイスで、最小単位が1バイトであるため、1文字でも 出力すれば装置にも反映されます。 これに対し、ファイル(ディスク)はブロック型デバイス になります。最小入出力単位はセクタサイズになります。 つまり、512バイト(だったと思う。間違ってたらゴメン) 単位でしか入出力できません。これを1バイト毎に反映 しようとすると、セクタの読み込み→変更→書き込み という 動作を1バイト毎にしなければなりません。 これではディスクIOの回数が膨大なものになり、効率が 極端に悪くなります。それでバッファリングする訳です。 ついでに言うと、1セクタのIOと、1シリンダのIOの時間は あまり変わりません。

ycuhakecha
質問者

お礼

詳しい説明、ありがとうございます。 説明に基づき、あえてバッファーが一杯になるように、 沢山の!!!!!!!を表示する実験をしてみました。 printf("!!!!!!!!!!!!!!!!!!!!!!!!!・・・・・・・・・・・!!!!!!!!!!!!!!!!!!!!!\n"); すると、test.exeの実行途中(10秒にならない間でも) リダイレクトされることが確認できました。 やはり、バッファに入ったままなのですね。 今回実際にやろうとしたことは、icl.exe(インテルC++コンソールコンパイラー)のGUI化です。 Windowsプログラムから、icl.exeをCreateProcessで動かして、コンパイル過程やエラー表示などを リダイレクトして、Windowsプログラム上に表示させようとしていました。 コンパイルで時間がかかる場合も、最後まで待たずに表示したいと思っていました。 ちょっと無理そうですね。 でも、無理な理由が分かってすっきりしました。 ありがとうございました。

その他の回答 (7)

  • nak777r
  • ベストアンサー率36% (49/136)
回答No.8

>今回実際にやろうとしたことは、icl.exe(インテルC++コンソールコンパイラー)のGUI化です。 >Windowsプログラムから、icl.exeをCreateProcessで動かして、コンパイル過程やエラー表示などを >リダイレクトして、Windowsプログラム上に表示させようとしていました。 >コンパイルで時間がかかる場合も、最後まで待たずに表示したいと思っていました。 参考程度に、 こういうのはいかがでしょう http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html やった事が無いので、出来るかどうかは知りません

参考URL:
http://www.atmarkit.co.jp/fdotnet/dotnettips/657redirectstdout/redirectstdout.html
ycuhakecha
質問者

お礼

ありがごうございます。 リダイレクトが明示的に行える関数が存在するのですね。 icl.exeの出力がバッファにたまるかや、 icl.exeが実行途中でも非同期に出力を確認できるかは、 やってみないとわかりませんね。 参考にさせて頂きます。

  • php504
  • ベストアンサー率42% (926/2160)
回答No.7

出力が何メガバイトでもファイルが閉じられるまでは内容は更新されないですよね ディスクにデータが書き込まれてもそれが直ちにファイルシステム上でファイル名と関連づけられるわけではないと理解しています リダイレクト先のファイルが閉じるのは元の実行ファイルが終了するときなので結局リダイレクト元のプログラム終了までファイルの内容は更新されないと言うことではないでしょうか

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

ycuhakecha
質問者

補足

書き込みありがとうございます。 以下にオーバーフローさせる実験を書かせて頂きました。 今回は、面白い実験をさせて頂きました。 皆様ありがとうございました。 私の認識ミスや、もっとこうすれば、などありましたら、 今後もよろしくお願いします。

noname#140045
noname#140045
回答No.5

No.3です。 誤りがありましたので訂正します。 コンソール出力でもバッファリングされますが、その場合は、'\n'(改行コード)で出力される仕様になっています。

ycuhakecha
質問者

お礼

詳しく、何度も根気よく説明してくださりありがとうございました。 一人ひとりに的確なお礼がかけなくてすみません。 皆さんに感謝しています。

ycuhakecha
質問者

補足

test.exeはあくまで例で、このプログラムは”変更できない”が拘束条件として質問させて下さい。 例えば、gcc.exeなど、外部プログラムを使う場合などと思って下さい。 よって、C言語のファイル出力ではなく、 「リダイレクト」について、教えて頂ければと思っています。 今回、リダイレクトの実験のために、以下のソースをコンパイルし、test.exeとしました。 int main() { for(int i=0;i<10;i++){ printf("!!!!!!\n"); sleep(1); } return 0; } 改行コードが入りですので、バッファリングすることなく、コンソール画面に"!!!!!!"が表示されます。 しかし、これをリダイレクトしても、ファイルへは10秒後にしか反映されませんでした。 「それは仕様で、方法はありません」が答えでも、もちろんOKです。 設定を変えたり、他のコマンドやオプションで変更できる方法があれば、 と思い、質問させて頂きました。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

>test.exeは既存プログラムのため、変更できません。 あきらめてください。 おそらくprintf等の関数で出力していると思いますが、 バッファリングされている入出力の場合はファイルを 閉じるかflushするまで内部に保留された状態が続き ます。どちらの手当もされていなければ、バッファが 溢れるか、標準出力が閉じられるまで、外部に出力 されることはありません。出てこないものを外部で 努力しても受け取ることはできません。

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

noname#140045
noname#140045
回答No.3

No.2です。 >test.exeの結果は、バッファにたまることなく バッファリングされるかどうかは、出力する媒体によって違います。 画面上ではバッファリングされないだけです。 (もし疑うのならば、C言語の開発環境はあるようなので自分で試してみればいいでしょう) ですから、test.exeを書き換えできないのならば、答えとしてはできないと言うことになります。 もしかしたら、システムをいじればできるのかも知れませんが、test.exeだけでなく他へも影響しますので、現実的とは言えないでしょう。

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

noname#140045
noname#140045
回答No.2

言語が書いてないので、正解ではないかも知れませんが、考え方を書きたいと思います。 C言語であれば fflash(stdout); を使って強制的にはき出します。 「バッファリング」と言われ、ディスクに出力する場合などは小まめにはき出されるのではなく、ある程度のサイズになるまでメモリー上に保存してから出力するようにします。 この方が効率良くディスクに書き込めるからです。 他の言語でも同じことをできるはずですので、調べるか言語を明示すれば具体的な解答が得られるでしょう。

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/fflush.html
ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

ycuhakecha
質問者

補足

お返事ありがとうございます。 説明不足ですみません。 test.exeは既存プログラムのため、変更できません。 test.exeの結果は、バッファにたまることなく、コンソール画面に1秒置きに表示されています。 リダイレクトされるファイル自体は、空の状態ですぐに作成されますが、 中身が得られるのが、10秒後に一気に、という状態です。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

text.exeを作った言語は何でしょう? C言語であるなら、低水準入出力を使うことで、 リアルタイム出力が可能です。 for ( i = 0 ; i < 10 ; i++ ) {     //printf("%s\n", "!!!!!!"); //これはダメ     write(stdout->_file,"!!!!!!",6); //このようにする     Sleep(1000); //1秒待機 }

ycuhakecha
質問者

お礼

お礼し忘れていました。 大変失礼しました。 ありがとうございました。

ycuhakecha
質問者

補足

お返事ありがとうございます。 また、説明不足ですみません。 test.exeは既存のプログラムで、私が変更できません。 なお、WindowsXP上のコンソールでの実行です。 reply.exeは、C言語で作りました。

関連するQ&A