2013-07-22 1 views
0

C++ (부스트 라이브러리 사용)로 작성되고 xcode로 컴파일 된 콘솔 응용 프로그램이 있습니다.이 유닉스 실행 파일은 데몬과 통신하고 특정 작업을 수행합니다. 이 콘솔 응용 프로그램을 모든 인수와 함께 명령 줄에서 실행하면 완벽하게 작동합니다. 하지만 Java 코드에서이 콘솔 응용 프로그램을 호출 할 때 실행되지 않습니다. ProcessBuilder을 사용하고 있습니다. 동일한 코드를 사용하여 시스템 관련 명령을 실행할 수 있습니다. 내가 사용하고있는 콘솔 어플리케이션은 정적 라이브러리에 의존한다. - 1.7, 맥 OSX - 10.7.5, 엑스 코드 - 4.6.2, 부스트 버전 - 1.53.0 JDK : 다음MAC OSX에서 Unix 실행 파일을 실행할 수 없습니다

는의 사용하고있는 사양입니다. 내가 사용하고

코드 :

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

사용중인 정확한 명령은 무엇입니까? 'ProcessBuilder'를 사용하는 방법의 샘플 코드. 어떤 예외가 있습니까? 사실 우리가 스스로 명령을 실행할 수 없다는 사실을 감안할 때, 문제에 대한 더 많은 정보를 제공해야하고 원격으로도 도움을 줄 수 있어야합니다. – MadProgrammer

+0

오류 스트림도 함께 사용해야합니다. –

답변

0

또 다른 옵션은 Open System call입니다.

당신은 String str[] = {"/bin/sh", "-c", "open -a Terminal /Users/user/Downloads/cppapplication_1"};

가 나는 그것이 open system call 함께 일 이유도 같은 문제에 직면 한 후, 타사 유닉스 실행 파일이 명령 줄에서 잘 작동하고, 정확한 이유를 알고 있지만 자바 코드로 해달라고 사용할 수 있습니다. Java 코드에서 호출 할 때 프로세스가 종료되지 않고 출력을 생성하지 못했습니다. 그 때 Open system call이 나를 위해 일했던 유일한 문제는 새로운 터미널 창을 시작한다는 것이 었습니다. 터미널 창을 숨기기 위해 osascript -e 'tell application "System Events" to set visible of process "'Terminal'" to false'으로 관리했습니다.

0

나는이 문제를 오래 전 알고 있지만, 나는 osX에서 유닉스 실행 파일과 똑같은 문제를 겪었다. 머리를 잡아 당겨서 만들었습니다.

마지막이 나를 위해 일한 :

* 

    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를 종료했다. 실제로 outputStream이 없을 때 outputStream이 일종의 입력을 기다리고있는 것처럼 보였습니다.

그래서 제 경우에는 outputstream을 닫는 것이 트릭을했고 exec는 예상대로 작동합니다. 프로세스가 입력을 기다리고있는 이유에 대한 입력 (인식 할 수없는 EOL?)이 도움이 될 수 있습니다.