我有 2 个应用程序,一个用 C 编写,另一个用 JAVA 编写。我们将这些应用程序称为“C”和“JAVA”。
- C 通过 mkfifo 创建命名管道(也尝试过 mknod - 结果没有区别)
- C fork 子进程,调用 system() 调用来启动 JAVA 应用程序,并将 FIFO 文件的名称传递给它。 IE:系统(“java-app名称'fifo文件名称'”)
- C 父级打开 FIFO 仅供写入
JAVA 打开 FIFO 进行读取。
- C 通过 write() 向 FIFO 发送“握手”消息。
- JAVA 接收“握手”
- 然后,C 尝试通过 FIFO 将后续消息发送到 JAVA。
这就是奇怪的地方。除非C关闭(而不是删除)FIFO FD或者如果父进程终止,JAVA将不会从FIFO读取。如果 C 发送“握手”然后关闭,则一切正常且符合预期。 如果C然后重新打开FIFO,向JAVA发送一条“消息”,然后C关闭,JAVA将读取它。
从我研究过的所有C 和JAVA 之间的FIFO 示例来看,它们仅包含单次数据传输。 IE,打开,写/读,关闭,但不是按照我的要求从源到目的地的连续流。
在每一端实现“打开、读/写、关闭”是可行的,但肯定有一个更好/更有效的方法——更符合管道的精神。如果是这样,我将不胜感激任何意见!
最佳答案
已解决
JAVA 的 readline 需要 '\r' 或 '\n' 来终止字符串。来自 UNIX C 环境(其中人们期望“\0”作为“标准”终止符)并且对 JAVA 相当陌生,这是一个有趣的类(class)!
Tnx chrylis 和 fge 供您输入!
关于java - C 进程和 JAVA 应用程序之间的 FIFO 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28658353/