在java中读取c程序的stdout

时间:2012-12-16 21:02:22

标签: java c stdout

所以我有一个通过ProcessBuilder调用C程序的java程序,我需要C程序在发生某些事情时通知Java程序。我有以下java prog的代码:

    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");

但我不能让java程序读取它,我得到的唯一输出是

false
null

1 个答案:

答案 0 :(得分:2)

在刷新缓冲区之前,Java程序将看不到输出。

write级别的缓冲是依赖于操作系统的,即使在同一操作系统内,不同类型的流也可能具有不同的默认缓冲模式。在Linux中,文档暗示管道的write将立即被其他进程读取,ProcessBuilder至少在Android中使用管道。

如果你使用stdio.hfflush可能会将数据一直推送到套接字或管道。例如。我在Android中使用fflush为此目的取得了ProcessBuilder的成功。

行缓冲是操作系统的另一种可能选择。在这种情况下,将\n附加到您的邮件可能会产生影响。

顺便说一句,在同一个程序中混合writeprintf个来电是一件麻烦事。正如已经提到的,write(0是尝试写入stdin,而strlen(buf)+1导致最后的零字节被发送到Java程序,这不太可能是你的想。