Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从C向Java发送信号_Java_C_Signals - Fatal编程技术网

从C向Java发送信号

从C向Java发送信号,java,c,signals,Java,C,Signals,因此,我有一个Java程序,它创建在终端(unix)上运行某个C程序的进程,并且我需要在C程序中发生某些事情时(在终止之前)通知Java程序。我该怎么做?我知道我需要信号,但我在这方面没有太多经验 提前谢谢 编辑:这是我在调用流程后对java所做的更改: InputStream stdout = p.getInputStream(); InputStreamReader isr = new InputStreamReader(stdout);

因此,我有一个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);
但运行之后,我只得到:

INPUT
/INPUT
Process exitValue: 0

您可以使用c程序创建套接字并将其发送到JavaSocket服务器。您可以在Google上搜索示例。

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

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

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


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

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

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

(链路失效)


是的,我正在java中使用Runtime.exec()。所以我只是在C程序中使用write()函数?是的,
write
,然后
flush
就可以了。在Java方面,只需从输入流中执行
read()
。其中一个“问题”是刷新,当C程序没有交互控制台时,它可能默认为“只有当非常大的缓冲区已满”。对,这只是一个提示,在哪里可以找到答案是的,如果你不知道的话,这很烦人。你从命令行测试程序,一切正常,然后从另一个程序执行,但没有得到任何输出,然后梳理你的程序,找出一种不同的错误,它不在那里…我编辑了第一篇文章的变化,但我没有得到任何东西。我做错什么了吗?举个例子,它似乎做了你想做的,试试看
    Process p = Runtime.getRuntime().exec("c.exe");
    InputStream stdout = p.getInputStream();