2011-11-08 5 views
0

コマンドの出力をファイルにリダイレクトするシェルスクリプトに関するヘルプを探しています。シリアルポートとディスプレイから入力を読み取るCプログラムがあります。このデータをファイルにリダイレクトします。私は更新取得されませんfile.txtを出力をリダイレクトするシェルスクリプト

./program >> file.txt 

として、私は、スクリプトファイルの書き込みしようとしている

Runtime r = Runtime.getRuntime(); 
Process procObj = r.exec("sh " + scriptfile); 

を呼び出すことにより、Javaプログラムからこれを実行しています。ここで、ポートへの接続が失われるまで、プログラムは無限に実行されるという意味で終了しません。だから、私のプログラムはポート上のデータを探し続け、そこにあるときに表示します。 同じ出力を、ログとして使用するファイルにリダイレクトするだけです。 私はHow to make shell output redirect (>) write while script is still running?を見ましたが、役に立ちません。

親切に助けて...

+0

この回答にお問い合わせください:http://stackoverflow.com/questions/8007871/how-to-run-a-perl-file-using-java/8008156#8008156 – bpgergo

+0

私はごめんなさい私の質問には上記のリンクが当てはまります。私はスクリプトファイルを呼び出して実行することができます。私は通常のエコーコマンドを与えると、それが動作し、出力はファイルに非常によくリダイレ​​クトされます。私の言ったように私のCプログラムは決して終了せず、出力はファイル内で継続的に更新する必要があります。 –

+0

しかし、プログラムが最終的に終了すると、ファイル*は更新されますね。 – jpalecek

答えて

1

はあなたが./program >> file.txt 2>>file.txt、または./program 2>&1 >>file.txtを試すことはできますか?

2

programの出力はどのくらい出力されますか?標準のIOリダイレクトを使用すると、stdoutfileの間に4KBのバッファが追加されます。これは、OSがファイルへの書き込みを開始する前に、プログラムが4KB以上のデータを出力しなければならないことを意味します。

これを修正するには、「作業単位」が完了したときにプログラムにstdout.flush()を追加します(1行でも複数行でも構いません)。

+0

"標準IOリダイレクション"でバッファが追加されるのはなぜですか? – hagello

+1

"OSがファイルへの書き込みを開始する":システムコールを節約するために、libcはユーザ空間のバッファリングを行います。 – hagello

+1

I/Oリダイレクションは、シェルの機能です。 libcはstdin/stdoutハンドルのタイプを検出し、それに応じてバッファリングを設定します(未知のタイプではなし、調理端末ではバッファされたライン、ファイルとパイプでは4KB)。 –

1

あなたは出力用の標準C・コール(printfputsなど)を使用する場合は、単にこの

List<String> cmd = new ArrayList<String>(); 
    cmd.add("sh"); 
    cmd.add("-c"); 
    cmd.add("program 1> file.txt 2>&1"); 

    ProcessBuilder pb = new ProcessBuilder(cmd); 
    Process p = pb.start(); 
0

を試してみてください、あなたの出力はバッファされるかもしれません。 C89以降では、バッファリングモード(バッファなし、完全バッファリング、ラインバッファリング)とバッファのサイズによって、出力がバッファリングされているかどうか、およびバッファがフラッシュされたかどうかによって異なります(http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.htmlおよびman setvbuf参照)。

デフォルトでは、ファイルへの出力はLinux上で完全にバッファされます。あなたは出力は、出力ファイルにすぐにあなたを表示したい場合があります。

  • 使用fflush()バッファリングオフスイッチシステムコールwrite()man 2 write
  • を使用
  • 各出力操作の後: setvbuf(stdout, NULL, _IONBF, 0);https://stackoverflow.com/a/7876756/601203

この動作は、シェルスクリプトを使用してJavaプログラムでCプログラムを起動するという事実とは関係ありません。この動作は、プログラムにリンクしている標準Cライブラリに依存します。

関連する問題