【问题标题】:Read stdout of c program in java在java中读取c程序的stdout
【发布时间】:2012-12-16 21:02:21
【问题描述】:

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

【问题讨论】:

  • 你不应该start() 处理之后你设置流阅读器来监听它的输出吗?
  • 我对这些东西一无所知,所以如果我现在很傻,请告诉我,但对我来说,看起来你是从 stderr 而不是 stdout 读取的,这听起来像是你想要的从...读取?
  • char Buff[] = "output\n"; write(1, Buff, strlen(Buff));printf("output\n"); fflush(stdout);

标签: java c stdout


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2014-08-21
    • 1970-01-01
    相关资源
    最近更新 更多