3

所以我有这个Java程序,它创建在终端(unix)上运行某个C程序的进程,并且当C程序中发生某些事情时(在终止之前)我需要通知Java程序。我怎样才能做到这一点?我知道我需要信号,但我在这方面没有太多经验。

提前致谢!

编辑:这是我在调用进程后对 java 所做的更改:

            InputStream stdout = p.getInputStream();
            InputStreamReader isr = new InputStreamReader(stdout);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<INPUT>");
            while ( (line = br.readLine()) != null)
                System.out.println(line);
            System.out.println("</INPUT>");
            int exitVal = p.waitFor();
            System.out.println("Process exitValue: " + exitVal);

当我想通知java时,我在C中做了什么:

char buff[20];
size_t nbytes;
ssize_t bytes_written;
int fd;
strcpy(buf, "This is a test\n");
nbytes = strlen(buf);
bytes_written = write(1, buff, nbytes);

但运行它后,我只得到:

INPUT
/INPUT
Process exitValue: 0
4

4 回答 4

4

其中一种方法是读取 C 程序的标准输出

    Process p = Runtime.getRuntime().exec("c.exe");
    InputStream stdout = p.getInputStream();

现在 C 程序可以与 Java 程序对话

于 2012-12-16T17:30:41.637 回答
1

您可以使用 c 程序创建一个套接字并将其发送到 java 套接字服务器。您可以在 goole 上搜索以查找示例。

于 2012-12-16T17:28:57.963 回答
1

在 Java 程序和由它生成的另一个程序之间进行通信的最简单方法是使用启动子进程时设置的 FIFO 流。因此,例如,如果您使用Runtime.exec()或 using启动子流程ProcessBuilder,您将拥有一个类型为 的对象Process。通过调用它getInputStream(),您可以访问进程的标准输出。

在本机代码中,只需将信号打印到标准输出,Java 进程就可以读取它们。

于 2012-12-16T17:31:27.367 回答
1

您可以将信号与 Java 一起使用,但这不是最好的机制。我会先考虑使用 JNI、JMS、Socket、RPC 或其他一些解决方案。信号的问题在于它不允许您传输太多信息,而且它最容易正确或调试。

有关信号处理和 Java 的更多详细信息

http://www.oracle.com/technetwork/java/javase/signals-139944.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/(链接失效)

http://ringlord.com/dl/Signals-in-Java.pdf

于 2012-12-16T17:31:54.217 回答