我有两个独立的进程:一个 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 程序在处理输入之前等待第一个程序完成。
对于这个问题的解决方案,有没有人有任何想法、建议或见解?提前致谢!
最佳答案
管道应该没问题;您只需要控制何时刷新您的 C 程序的输出,以使其逐渐可供 perl 脚本使用。您可以在 C 程序中使用 fflush()
执行此操作,这将强制推出 C 程序的缓冲区,以便 perl 程序可以读取它。
管道本身并没有什么会导致 perl 程序在处理其输出之前等待 C 程序完成编写。你编写的 perl 程序是为了处理 STDIN
一次一行:
while ($line = <STDIN>) { ... }
<>
在这种情况下,从 STDIN
中读取一行,但如果没有可用的,它将阻塞直到有一个可用。调用 fflush()
来自 C 程序将实现这一点。
看看 Wikipedia article on Pipelines .实现部分简要描述了管道是如何缓冲的,这应该有助于您了解您的进程如何通信。管道确实允许进程之间的并发,读取和写入管道的进程与其他进程一样由调度程序管理。您的问题在于缓冲。
关于c - 如何允许两个并发进程进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/712494/