我有一个用C ++编写的控制台应用程序(使用boost库)并在xcode中编译,这个unix可执行文件与守护进程通信并执行特定任务。
当我从命令行运行这个控制台应用程序与所有参数时,它完美地工作。
但是,当我从Java代码调用此控制台应用程序时,它没有执行。
我正在使用ProcessBuilder
来执行它。能够使用相同的代码执行系统相关的命令。我正在使用的控制台应用程序取决于静态库。
以下是我正在使用的规范: Jdk - 1.7, Mac OSX - 10.7.5, XCode - 4.6.2, Boost版本 - 1.53.0。
我正在使用的代码:
String str[] = {"/bin/sh", "-c" ,"/Users/user/Downloads/cppapplication_1"};
ProcessBuilder builder = new ProcessBuilder(str);
builder.directory(new File("/Users/user/Downloads/"));
final Process process = builder.start();
process.waitFor();
InputStream is = process.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
它没有抛出任何错误。它悬挂着。
非常感谢任何帮助。
答案 0 :(得分:0)
另一种选择是使用Open System call
。
您可以使用String str[] = {"/bin/sh", "-c", "open -a Terminal /Users/user/Downloads/cppapplication_1"};
我不知道它与open system call
一起使用的确切原因,一旦我也面临同样的问题,第三方unix可执行文件在命令行中工作正常,但没有使用java代码。从java代码调用时Process没有终止也没有生成任何输出到stout。
那个时间Open system call
对我有用,唯一的问题是它启动了一个新的终端窗口。我使用osascript -e 'tell application "System Events" to set visible of process "'Terminal'" to false'
进行管理以隐藏终端窗口。
答案 1 :(得分:0)
答案 2 :(得分:0)
我知道这是一个老问题,但我在osX上的unix可执行文件中遇到了同样的问题,最后一天。让我拉出一点点头发。
最后这对我有用:
*
proc = builder.start();
OutputStream out = proc.getOutputStream();
out.close(); //This part is the key
BufferedReader bufferReader = new BufferedReader(new InputStreamReader(proc.getInputStream()));
//proceed to read from the buffered reader etc.
*
我必须手动关闭输出流,如上所述。当实际上没有输出时,似乎outputStream正在等待某种输入。
所以在我的情况下,无论如何,关闭输出流就可以了,并且exec正在按预期工作。当没有(无法识别的EOL?)时,进程为什么等待输入的任何输入可能会有所帮助。