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

时间:2009-04-03 03:51:45

标签: c perl pipe

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

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

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

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

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

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

是否有人对此问题的解决方案有任何想法,建议或见解?提前谢谢!

2 个答案:

答案 0 :(得分:16)

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

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

while ($line = <STDIN>) { ... }
在此上下文中,

<>STDIN中读取一行,但如果没有可用的那行,则会阻塞一行。从C程序调用{​​{1}}将使这种情况发生。

看看Wikipedia article on Pipelines。实现部分简要介绍了如何缓冲管道,这可以帮助您了解流程的通信方式。管道执行允许进程之间的并发,并且管道读取和写入的进程由调度程序管理,就像其他进程一样。你的问题在于缓冲。

答案 1 :(得分:5)

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