Unix Executable无法在MAC OSX中执行

时间:2013-07-22 05:07:44

标签: java macos terminal processbuilder

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

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

非常感谢任何帮助。

3 个答案:

答案 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?)时,进程为什么等待输入的任何输入可能会有所帮助。