2013-03-06 2 views
1

Java를 통해 바이너리 ('C'로 작성)를 실행하려고하는데 바이너리가 성공적으로 실행됩니다. 'Enter'키 입력이 누를 때까지 실행 제어를이 코드 (차단됨)로 리턴하지 않습니다. 이 문제 때문에 'prcs.waitfor() == 0'이 실행되지 않으며 사용자는 바이너리 실행이 성공했는지 여부를 알 수 없습니다. OutputStream에 'Enter'키 스트로크 (// r)를 보내기 위해 BufferedWriter를 만들려고했으나 작동하지 않습니다. 실행 제어가이 코드로 돌아가고 'prcs.waitfor() == 0'이 실행되도록하기 위해 여기서 수행해야하는 작업. 먼저 명령을 성공적으로 실행하는 데 의존하는 다른 명령을 실행해야합니다. 나는 그것이 r 다음 \의이 :(ProcessBuilder를 통해 실행되는 'C'바이너리가 실행 흐름을 차단합니다.

// Start ProcessBuilder, 'str' contains a command 

    ProcessBuilder pbuilder = new ProcessBuilder(str); 
    pbuilder.directory(new File("/root/workspace/Project1")); 
    pbuilder.redirectErrorStream(true); 
    Process prcs = pbuilder.start(); 
    AForm.execStatustext.append("\n=> Process is:" + prcs); 

    // Read output 
    StringBuilder out = new StringBuilder(); 
    BufferedReader bfrd = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    String current_line = null, previous_line = null; 
    while ((current_line = bfrd.readLine()) != null) { 
     if (!line.equals(previous_line)) { 
      previous_line = current_line; 
      out.append(current_line).append('\n'); 
      //System.out.println(line); 
     } 
    } 
    //process.getInputStream().close(); 
    // Send 'Enter' keystroke through BufferedWriter to get control back 
    BufferedWriter bfrout = new BufferedWriter(new OutputStreamWriter(prcs.getOutputStream())); 
    bfrout.write("\\r"); 
    bfrout.newLine(); 
    bfrout.flush(); 
    bfrout.write("\\r"); 
    bfrout.newLine(); 
    bfrout.flush(); 
    //process.getOutputStream().close();*/ 

    if (prcs.waitFor() == 0) 
     System.out.println("Commands executed successfully"); 
    System.exit(0); 
+0

코드에 오류가있는 것 같습니다. BufferedReader bfrd = new BufferedReader (new InputStreamReader (process.getInputStream())). "프로세스"가 "prcs"가 아니어야합니다. – Ifthikhan

+0

@Ifthikhan 예. 'prcs'bu 여야합니다. 그건 그냥 오타입니다. BufferedWriter를 통해 'Enter'를 실행할 수 없다는 문제가 여전히 존재합니다. 그것을 들여다 주셔서 감사합니다. –

답변

0

\\r 캐럿되지 복귀와 붙어있어. 캐럿 복귀는 단지 \r

입니다 bfrout.newLine(); 커버해야 플랫폼에 따라 행 단락. 어쩌면 당신 돈

+0

답장을 보내 주셔서 감사합니다. 나는 두 가지를 시도했지만 여전히 '/ r'또는 bfrout.newLine()을 'Enter'키스트 로크로 사용하지 않습니다. 실행 흐름이 시스템 호출에서 멈추고 따라서 (prcs.waitFor == 0) 블록이 실행되지 않습니다. –

+0

업데이트 : 내가 알아챈 한 가지는 processbuilder를 통해 시스템 호출을 실행 한 후 명령을 실행하는 데 6 초가 걸린 다음 InputStreamReader를 통해 성공 메시지를 반환한다는 것입니다. 이 지연 때문에 'process.waitFor == 0'이 실행되지 않을 수 있습니까? 하지만 6 초 후에는 어쨌든 사형 당해야한다고 생각하고 있었습니까? –

+0

@losmx : 새로운 입력을 기다리는'bfrd.readLine()'에서 코드가 차단되지 않았습니까? –

관련 문제