0

我有一个用 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);
        }

它没有抛出任何错误。它的悬挂。

任何帮助深表感谢。

4

3 回答 3

0

另一种选择是使用Open System call.

您可以使用String str[] = {"/bin/sh", "-c", "open -a Terminal /Users/user/Downloads/cppapplication_1"};

我不知道它工作的确切原因open system call,一旦我也面临同样的问题,第三方 unix 可执行文件在命令行中运行良好,但不适用于 java 代码。从 java 代码调用时,进程没有终止,也没有生成任何输出到 stout。那段时间Open system call对我有用,唯一的问题是它正在启动一个新的终端窗口。我管理它osascript -e 'tell application "System Events" to set visible of process "'Terminal'" to false'以隐藏终端窗口。

于 2013-07-24T03:43:36.443 回答
0

尝试使用 Java ProcessBuilder 和 Process 执行系统进程

这绝对会帮助你。

于 2013-07-24T11:56:15.697 回答
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?),可能会有所帮助。

于 2016-02-16T06:36:35.187 回答