2011-11-08 114 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库。