0

所以我有一个通过 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
4

1 回答 1

2

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

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

stdio.h如果您使用它,很可能fflush会将数据一直推送到套接字或管道。例如,我fflush在 Android 中使用ProcessBuilder.

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

顺便说一句,在同一个程序中混合writeprintf调用是自找麻烦。正如已经提到write(0的,尝试写入stdin,并strlen(buf)+1导致将最后一个零字节发送到 Java 程序,这不太可能是您想要的。

于 2012-12-16T21:50:46.230 回答