• ベストアンサー

bashの標準出力のリダイレクトのタイミング

CentOS上でC言語でプログラムを作成し、printfで計算結果を表示させています。 具体的には一回の試行ごとにprintfで表示させ、それを数百回繰り返すプログラムです。 これをbashの標準出力のリダイレクトを用いてファイルに書き出そうとしているのですが、結果が一回の試行ごとにファイルに書き出されません。数時間待ってみると数回の試行の結果がまとめて書き込まれているので、インターバルがあるのかと考えたのですが、リダイレクトされるタイミングの設定は変更可能ですか? 入力したコマンドは hogehoge > fuga.csv & です。

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

  • ベストアンサー
  • trapezium
  • ベストアンサー率62% (276/442)
回答No.2

C コードで setvbuf() するか stdbuf が使えるなら stdbuf -o 0 hogehoge > fuga.csv & 行バッファリングでもいいなら -o L

mikimouse2100
質問者

お礼

回答ありがとうございます。 stdbufでバッファリングをなしにしたところ、即時出力されるようになりました。 ありがとうございました。

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1619/5654)
回答No.3

bashは関係なくてC標準ライブラリの方でバッファリングされていることが原因です。 ですので#2の方の書かれている方法や、printf()で出力する毎にfflush(stdout)する事で対応してください。

mikimouse2100
質問者

お礼

C標準ライブラリのバッファの問題なのですね。 無事解決しました。ありがとうございました。

  • kawais070
  • ベストアンサー率52% (2242/4282)
回答No.1

> インターバルがあるのかと考えたのですが 確信は無いけど、インターバルじゃなくてキャッシュが効いてるのじゃないかと思います。 キャッシュにある程度溜まったらリダイレクト先に出力されるという感じ。 C言語なら、fflush関数とかでキャッシュを強制的に吐き出させるようにプログラミングすれば変化があるかも。

mikimouse2100
質問者

お礼

ご推察の通り、バッファの問題でした。 ありがとうございました。

関連するQ&A

  • 標準出力とリダイレクトを同時に実行

    標準出力の結果をファイルに保存するにはリダイレクトを使うと思いますが、同時に標準出力にも表示したいです。 同時に、リダイレクトの「>>」のように、追記していくようにしたいです。 そのような場合、 http://blog.goo.ne.jp/minimal_room/e/26b4d965cd67ac5abfc4ca024e69501f によれば、teeコマンドを使うと良いそうなのですが、 ./a.out | tee log.txt のようにすると、標準出力されず、上手くいきませんでした。 どのようなコマンドを打ったら良いか教えて下さい。

  • bashでの複数行のコマンドのリダイレクト

    Linux上のbashを使用して、複数行のコマンドの結果を一度にリダイレクトしたいと思います。 思いついた方法が、 #!/bin/bash cat << EOF >> ./test.log cat /etc/fstab cat /etc/inittab cat /etc/modprobe.conf EOF といった方法なのですが、これですとそれぞれのコマンドの結果ではなく、 単に cat /etc/fstab cat /etc/inittab cat /etc/modprobe.conf と言った出力結果がtest.logに出力されてしまいます。 上記のような複数のコマンドの結果を一度にリダイレクトする方法は無いでしょうか? cat /etc/fstab >> ./test.log cat /etc/inittab >> ./test.log cat /etc/modprobe.conf >> ./test.log と言った方法は避けたいと思います(実際には何10行と言うコマンド結果を出力したいので)

  • リダイレクト

    c言語の初心者です。手元の「c言語体当たり学習徹底入門」という本で独学しているとことなのですが、そこの92ページにリダイレクトが出てきます。コマンドプロンプトで プログラム名 < data.txt でプログラムにdataを読み込ませることがができるそうです。やってみると、ソースファイルが立ち上がり、なぜかコンパイルできません。データを読み込んだのでソースファイルのコンパイルは不要なのでしょうか?いづれにせよ結果が表示されないので成功したとはいいがたいです。だれが助言をお願いします。

  • bashでfold整形後のリダイレクトについて

    bashのスクリプトについて質問させてください。 現在、サーバプログラムexecの起動とログ出力を以下のコマンドで実行しております。 exec > server.log しかし、execの出力行の中に、server.logをviで開くことができないような、文字数の多い行が出力されるようになったため 整形してリダイレクトしたいと考えております。そこで exec | fold -w 256 としたところ、exec起動時のログが整形されて正しく標準出力されました。 しかし、これを下記のようにリダイレクトしてファイル出力した場合、起動時のログが尻切れとなり、最後まで出力されませんでした。 exec | fold -w 256 > server.log 起動後にサーバに接続し、以降のサーバーログを出力させると、尻切れから先が出力されはしたのですが、 現在、起動後にserver.logを確認すると最終行の「server startup OK」という文字が確認できない、という状況になっております。 リダイレクトされたファイルにも、標準出力と同期して最終文字まで出力させる方法はございますでしょうか? よろしくお願いいたします。

  • bash forコマンドでソート

    bash forコマンドでソート CentOS8 bashの forコマンドで、ディレクトリ内のファイル名を部分指定した降順でソートした状態で順次読み込みしたいです。 <ファイル> aaa.dat bbbb_0001.dat TEST_0001.file TEST_0002.file TEST_0003.file <アウトプット> TEST_0003.file TEST_0002.file TEST_0001.file 基本的な読込と、lsコマンドの結果を基に読み込む方法はわかりましたが、これに降順ソートを加えるにはどうすれば良いでしょうか? <基本的な読込> for file in /dir1/TEST_*.file do echo $file done <lsコマンドの結果を基に読込> for file in $(ls /dir1/TEST_*.file) do echo $file done

  • リダイレクト時にコマンドラインにも表示

    linuxでプログラムの標準出力結果をコマンドラインに表示させながら,リダイレクトも同時に行うことってできるんですか? できるのならやり方を教えてください.

  • VisualC++のリダイレクトについて

    VisualC++で出力結果をコマンドプロンプト上ではなく、ファイルへリダイレクトする方法を教えてください。 どこで設定すればよいのか見つかりません。よろしくお願いします。

  • C言語、リダイレクト

    C言語の初心者です。 コマンドプロンプトで「./a.out <text.txt」とうつと、text.txtのデータを取得し、表示するプログラムをつくろうと思っています。 試行錯誤の結果 #include <stdio.h> main(){ char abc; scanf("%s",&abc); printf("%c",abc); } だとエラーもなくコンパイルできるのですが、肝心のファイルの中身が一文字までしか表示されません。 これはchar abcでabcを一文字だけの変数にしているからみたいですが、調べてみたのですがどうもここから先に進めません。 どこをどのように変えれば良いですか?お願いします。

  • 出力のリダイレクトコマンド「>」で 日本語をリダイレクトする方法?

    Redhat Linux 9の環境で、「ls」、「less」のコマンドで日本語ファイル名をうまく表示しましたが、「>」で日本語をリダイレクトすることはなかなかできなかった。 下記のコマンドを試したら、、バイナリファイルになったらしいです。 echo "日本語" > test.log 誰かご教授いただければ、大変助かります。 よろしくお願いします。

  • 誤って/home配下を削除してしまいました;;

    CentOS5.0で/home/hogehoge配下にMaildir/とMaildir /とういうディレクトリがあったので、Maildir /を削除しようと思い以下のコマンドを実行しました。 [root@111 ~]# cd /home/hogehoge [root@111 hogehoge]# rm -rf Maildir / 後日hogehogeユーザでログインしたところ, -bash: dircolors: command not found -bash: /usr/bin/id: No such file or directory -bash: [: =: unary operator expected -bash: /sbin/consoletype: そのようなファイルやディレクトリはありません 確認してみると/home配下が全て削除されてしまっていました。 rootユーザでのコマンドもパスが通っていないようでだいぶ使えないコマンドがあります。 色々試すも復旧にいたっていません。 お分かりなる方、復旧方法を教えてください。 よろしくお願いします。