java - C 进程和 JAVA 应用程序之间的 FIFO 问题

标签 java c ipc named-pipes fifo

我有 2 个应用程序,一个用 C 编写,另一个用 JAVA 编写。我们将这些应用程序称为“C”和“JAVA”。

  1. C 通过 mkfifo 创建命名管道(也尝试过 mknod - 结果没有区别)
  2. C fork 子进程,调用 system() 调用来启动 JAVA 应用程序,并将 FIFO 文件的名称传递给它。 IE:系统(“java-app名称'fifo文件名称'”)
  3. C 父级打开 FIFO 仅供写入

JAVA 打开 FIFO 进行读取。

  1. C 通过 write() 向 FIFO 发送“握手”消息。
  2. JAVA 接收“握手”
  3. 然后,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/

相关文章:

c - 如何为每个子进程分配一个新的终端窗口

c - fork父子通信

java - Android 倒计时器,新 Activity 继续计时器

java - Apache Beam/Dataflow ReShuffle 已弃用,该使用什么替代?

java - Android GridView setOnItemLongClickListener 在设置项目子部件的可见性后不起作用

c - shm_open : Differences between Mac and Linux

c - 如何知道 int* 数组的结尾?

java - 如何检查是否至少选中了一个复选框android

c - 在包装好的 SSE 花车上翻转标志

c - msgid 创建错误