UNIX STDOUT结束符号



我想从Java Process执行多个命令,但我不想为执行每个命令生成一个新的进程。因此,我制作了一个名为Shell的对象,用于保存进程的InputStream和OutputStream。问题是,如果我不通过附加来终止进程

"exitn"

我不知道InputStream的结尾在哪里,当我读取了整个输出时,InputStream进入等待状态,所以我需要知道何时停止下一次读取。输出的末尾是否有某种标准符号?因为我想到的是

final String outputTerminationSignal = checksum(command);
command += ";echo "" + outputTerminationSignal + "";echo $?n"

这样,当我得到outputTerminationSignal行时,我可以得到退出代码并停止读取。

final String line = bufferedReader.readLine();
if (line != null && line.equals(outputTerminationSignal)) {
final String exitCode = bufferedReader.readLine();
}

当然,这是可利用的,而且容易出错,因为在某些情况下,实际输出可能与我生成的outputTerminationSignal匹配,并且应用程序将在不应该读取的时候停止读取。我想知道是否有一些所谓的"outputTerminationSignal"标准来自我不知道的输出。

Unix不使用特殊字符或符号来表示流的结束。在java中,若您尝试从文件末尾的流中读取,则会得到EOFException。

话虽如此,如果你正在从连接到正在运行的程序的流中读取,那么你不会因为另一个程序空闲而得到EOFException。只有当另一个程序已经退出,或者它显式关闭了它的输出流(您正在从中读取)时,您才会得到EOFException。您所描述的情况听起来像是shell正在空闲等待另一个命令。在这种情况下,您不会从流中获得EOF指示。

您可以尝试让shell在等待命令时打印命令提示符,然后将命令提示符作为"命令结束"指示符。shell通常只在交互时才打印命令提示,但您可能会找到解决方法。

如果你想让shell进程退出而不向它发送"退出"命令,你可以尝试关闭你用来写入shell进程的流。shell应该将其视为文件的结尾并退出。

您可以向shell询问派生子级的PID,并监视其状态

最新更新