2012-12-16 4 views
0

그래서 ProcessBuilder를 통해 C 프로그램을 호출하는 Java 프로그램이 있으며, 뭔가 발생하면 Java 프로그램에 알리기 위해 C 프로그램이 필요합니다. 나는 java prog에 대해 다음과 같은 코드를 가지고있다 :java에서 C 프로그램의 stdout을 읽으십시오.

String cmd[] = //string to run the c program in the terminal, no probs here 
    ProcessBuilder builder = new ProcessBuilder(cmd); 
    builder.redirectErrorStream(true); 
    Process process = builder.start(); 

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    System.out.println(bufferedReader.ready()); 
    System.out.println(bufferedReader.readLine()); 

주어진 지점의 c 프로그램은 java 프로그램에 뭔가를 알려야한다. 버퍼가 플러시 될 때까지 내가

char Buff[] = "output"; 
write(0, Buff, strlen(Buff)+1); 
write(1, Buff, strlen(Buff)+1); 
printf("output\n"); 

처럼 많은 것을 시도하지만이 글을 읽을 수있는 자바 프로그램을 얻을 어차피, 내가 할 수있는 유일한 출력은

false 
null 
+1

출력을 듣기 위해 스트림 리더를 설정 한 후에 처리 *를 시작하지 않을까요? – Vulcan

+1

나는이 물건에 대해 아무것도 모른다. 그래서 만일 내가 어리석은 사람이라면 나에게 들었다. 그러나 나에게 그것은 당신이 stderr에서 읽는 것처럼 보이고 stdout가 아닌 것처럼 들린다. 그것은 당신이 읽고 싶어하는 것처럼 들린다. ..? –

+2

그것은'char buff [] = "output \ n"이거나; write (1, Buff, strlen (Buff));'printf ("출력 \ n"); fflush (stdout); – melpomene

답변

2

는 자바 프로그램은 출력을 볼 수 없습니다입니다 .

레벨에서의 버퍼링은 OS에 따라 다르며 동일한 OS 내에서도 다른 종류의 스트림은 다른 기본 버퍼링 모드를 가질 수 있습니다. 리눅스에서 문서는 write이 파이프에 즉시 다른 프로세스가 읽을 수 있음을 암시하며, ProcessBuilder은 적어도 안드로이드에서 파이프를 사용합니다.

stdio.h을 사용하면 fflush은 이식 가능한 방식으로 데이터를 소켓이나 파이프로 완전히 밀어냅니다. 예 : 나는 ProcessBuilder을 사용하여 안드로이드에서이 목적으로 fflush으로 성공했습니다.

OS에 대해 선 버퍼링이 가능합니다. 이 경우 메시지에 \n을 첨부하면 효과가있을 수 있습니다.

그런데 동일한 프로그램에서 writeprintf을 호출하면 문제가 발생합니다. 그리고 앞서 언급했듯이 write(0stdin에 쓰기를 시도하고 strlen(buf)+1은 최종 0 바이트를 Java 프로그램으로 보내므로 원하지 않을 것입니다.

관련 문제