C 进程和 JAVA 应用程序之间的 FIFO 问题
Issues with FIFO between a C process and a JAVA application
我有 2 个应用程序,一个用 C 编写,另一个用 JAVA 编写。让我们将这些应用程序称为 'C' 和 'JAVA'.
- C 通过 mkfifo 创建命名管道(也尝试过 mknod - 结果没有区别)
- C 与调用 system() 调用的子进程分叉以启动 JAVA 应用程序,将 FIFO 文件的名称传递给它。即:系统("name-of-java-app 'name-of-fifo-file'")
- C父打开FIFO只写
JAVA 打开 FIFO 进行读取。
- C 通过 write() 向 FIFO 发送 'handshake' 消息。
- JAVA 收到 'handshake'
- C 然后尝试通过 FIFO 将后续消息发送到 JAVA。
这就是它变得奇怪的地方。除非 C 关闭(而不是移除)FIFO FD 或者如果父进程终止,JAVA 将不会从 FIFO 中读取。如果 C 发送 'handshake' 然后关闭,一切正常并且符合预期。
如果 C 然后重新打开 FIFO,发送一个 'message' 到 JAVA 然后 C 关闭,JAVA 将读取它。
从我研究过的所有C和JAVA之间的FIFO例子来看,它们只包含一次数据传输。 IE,打开,write/read,关闭,但不是我要求的从源到目标的连续流。
在每一端实施 'open, read/write, close' 是可行的,但可以肯定的是,必须有一个 better/more 有效的方法 - 更符合管道的精神。如果是这样,我将不胜感激!
已解决
JAVA 的 readline 需要 '\r' 或 '\n' 来终止字符串。来自 UNIX C 环境(其中人们期望 '\0' 作为 'standard' 终止符)并且对 JAVA 相当陌生,这是一个有趣的教训!
Tnx chrylis 和 fge 供您输入!
我有 2 个应用程序,一个用 C 编写,另一个用 JAVA 编写。让我们将这些应用程序称为 'C' 和 'JAVA'.
- C 通过 mkfifo 创建命名管道(也尝试过 mknod - 结果没有区别)
- C 与调用 system() 调用的子进程分叉以启动 JAVA 应用程序,将 FIFO 文件的名称传递给它。即:系统("name-of-java-app 'name-of-fifo-file'")
- C父打开FIFO只写
JAVA 打开 FIFO 进行读取。
- C 通过 write() 向 FIFO 发送 'handshake' 消息。
- JAVA 收到 'handshake'
- C 然后尝试通过 FIFO 将后续消息发送到 JAVA。
这就是它变得奇怪的地方。除非 C 关闭(而不是移除)FIFO FD 或者如果父进程终止,JAVA 将不会从 FIFO 中读取。如果 C 发送 'handshake' 然后关闭,一切正常并且符合预期。 如果 C 然后重新打开 FIFO,发送一个 'message' 到 JAVA 然后 C 关闭,JAVA 将读取它。
从我研究过的所有C和JAVA之间的FIFO例子来看,它们只包含一次数据传输。 IE,打开,write/read,关闭,但不是我要求的从源到目标的连续流。
在每一端实施 'open, read/write, close' 是可行的,但可以肯定的是,必须有一个 better/more 有效的方法 - 更符合管道的精神。如果是这样,我将不胜感激!
已解决
JAVA 的 readline 需要 '\r' 或 '\n' 来终止字符串。来自 UNIX C 环境(其中人们期望 '\0' 作为 'standard' 终止符)并且对 JAVA 相当陌生,这是一个有趣的教训!
Tnx chrylis 和 fge 供您输入!