我有2个应用程序,一个用C编写,另一个用JAVA编写。让我们将这些应用程序称为" C"和" JAVA"。
C通过mkfifo创建一个命名管道(也尝试过mknod-与结果没有区别)
C通过子进程调用system()调用来启动JAVA应用程序,并将其传递给FIFO文件的名称,从而启动C。 IE:system(" 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,按我的要求,打开,写入/读取,关闭,但不是从源到目标的连续流。
在每个端部实现"打开,读取/写入,关闭"是可行的,但可以肯定的是,必须有一种更好/更有效的方法-与管道的精神更加一致。如果是这样,我将不胜感激!
无法提供没有问题代码的帮助,但直接的怀疑是您没有刷新自己的写照。
为什么system()而不是execve()?
另外,在写入管道后是否刷新()?
谢谢chrylis&fge。 代码:暂时无法发布。 如果仍然让我感到悲伤,请修剪相关部分并将其张贴。 刷新:我曾尝试刷新描述符,但未更改。 我什至尝试将其他NULL字符添加到要写入FIFO的字符串中-不变。 再次发送您的建议,谢谢!
解决了
JAVA的readline期望'\ r'或'\ n'终止字符串。 来自UNIX C环境(人们期望" \ 0"作为"标准"终结符),并且对于JAVA来说还很陌生,这是一个有趣的课程!
Tnx chrylis和fge供您输入!
同样在C语言中,行以\终止。 就像您说的那样,在C中使用\\0来终止整个字符串,但这是有区别的。