2011-11-08 143 views
0

我正在尋找一個關於shell腳本將命令的輸出重定向到文件的幫助。我有一個C程序,用於讀取串口和顯示器的輸入。我希望將這些數據重定向到一個文件。我從一個Java程序通過調用shell腳本重定向輸出

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

我曾嘗試寫劇本文件

./program >> file.txt 

的file.txt的執行,這是不會得到更新。在這裏,程序不會結束,直到端口連接丟失,從某種意義上說,它是無限運行的。所以我的程序不斷地在端口上查找數據,並在它出現時顯示它們。 我只需要將相同的輸出重定向到我將用作日誌的文件。 我看着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

我很抱歉,我cud不明白哪一部分上面的鏈接適用於我的問題。我可以調用腳本文件並執行它。如果我給出一個正常的回聲命令,它會起作用,並且輸出會很好地重定向到文件。正如我所說的,我的C程序永遠不會結束,輸出需要在文件中不斷更新。 –

+0

但是,當程序終於終止時,文件*得到*更新,不是嗎? – jpalecek

回答

1

你可以嘗試./program >> file.txt 2>>file.txt,或./program 2>&1 >>file.txt

2

program產生多少輸出?使用標準IO重定向將在stdoutfile之間添加4KB緩衝區。這意味着在OS開始寫入文件之前,您的程序必須輸出超過4KB的數據。

要解決此問題,請在「工作單元」完成(可能是一行,但可能多於一行)時將stdout.flush()添加到您的程序中。

+0

你爲什麼認爲「標準IO重定向」添加了任何緩衝區? – hagello

+1

「操作系統開始寫入文件」:爲了節省系統調用,libc在用戶空間中進行緩衝。 – hagello

+1

I/O重定向是shell的一項功能。 libc檢測標準輸入/標準輸出句柄的類型,並相應地設置緩衝(對於未知類型,對已熟化終端進行緩衝的行,對於文件和管道,緩衝爲4KB)。 –

1

只是試試這個

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

如果使用標準C調用輸出(printfputs等),您的輸出可能會緩衝。在C89及以後,它取決於緩衝模式(無緩衝,完全緩衝,行緩衝)和緩衝區的大小,無論您的輸出是否全部緩衝以及緩衝區是否被刷新(請參閱http://www.gnu.org/software/libc/manual/html_node/Buffering-Concepts.htmlman setvbuf)。

默認情況下,輸出到文件在Linux上完全緩衝。如果你想輸出立即出現在輸出文件,您可以:

此行爲與您通過shell腳本在Java程序中啓動C程序無關。此行爲取決於您已鏈接到程序中的標準C庫。