从C发送信号到Java

时间:2012-12-16 17:23:13

标签: java c signals

所以我有这个Java程序创建在终端上运行某个C程序的进程(unix),并且我需要在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 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

您可以使用c程序创建套接字并将其发送到Java套接字服务器。您可以搜索goole以查找样本。

答案 2 :(得分:1)

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

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

答案 3 :(得分: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