当前位置:  开发笔记 > 编程语言 > 正文

如何允许两个并发进程进行通信?

如何解决《如何允许两个并发进程进行通信?》经验,为你挑选了2个好方法。

我有两个独立的过程:一个C程序,它输出逗号分隔值,后面每秒一个换行符,一个Perl程序接受数据(格式相同)并处理这些数据.

C程序输出(通过printf)值如下:

1, 2, 3, 4, 5, 6  
7, 8, 9, 10, 11, 12  
...

Perl程序位于一个无限循环中,等待STDIN的行,以便处理这些数据:

while ($line = )
{
    chomp($line) # Line should now read "1,2,3,4,5,6"
    # Process data
}

我希望这两个过程实时通信.标准bash管道不起作用(例如process1 | process2),因为Perl程序在处理输入之前等待第一个程序完成.

有没有人对这个问题的解决方案有任何想法,建议或见解?先感谢您!



1> Todd Gamblin..:

管道应该没问题; 您只需要控制何时刷新C程序的输出以使其逐渐可用于perl脚本.您可以在C程序中执行此操作fflush(),这将强制推送C程序中的缓冲区,以便perl程序可以读取它.

管道中没有什么固有的东西会导致perl程序在处理输出之前等待C程序完成写入.编写perl程序,以便STDIN一次处理一行:

while ($line = ) { ... }

<>在这个上下文中读取一行STDIN,但如果没有一行可用,它将阻塞直到一行.fflush()来自C程序的调用将使这种情况发生.

看看关于管道的维基百科文章.实现部分简要介绍了如何缓冲管道,这可以帮助您了解流程的通信方式.管道确实允许进程之间的并发,并且管道读取和写入的进程由调度程序管理,就像其他进程一样.你的问题在于缓冲.



2> Chris Dolan..:

C程序应该明确地fflush()其输出缓冲区,或者使用pty.后者更尴尬但保持C代码更简单.如果您不熟悉,请尝试"man 3 fflush".

推荐阅读
ifx0448363
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有