8

我有两个独立的进程:一个 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 程序在处理输入之前等待第一个程序完成。

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

4

2 回答 2

17

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

管道本身并没有什么东西会导致 perl 程序在处理其输出之前等待 C 程序完成写入。你的 perl 程序是这样编写的,它一次处理STDIN一行:

while ($line = <STDIN>) { ... }

<>在这种情况下,从 中读取一行STDIN,但如果没有可用的,它将阻塞,直到有。从 C 程序调用fflush()将实现这一点。

查看有关 Pipelines 的 Wikipedia 文章。实现部分简要描述了管道是如何缓冲的,这将有助于您了解进程的通信方式。管道确实允许进程之间的并发,并且从管道读取和写入管道的进程由调度程序管理,就像其他进程一样。您的问题在于缓冲。

于 2009-04-03T04:02:12.663 回答
5

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

于 2009-04-03T03:58:04.747 回答