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

标签 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 程序在处理输入之前等待第一个程序完成。

对于这个问题的解决方案,有没有人有任何想法、建议或见解?提前致谢!

最佳答案

管道应该没问题;您只需要控制何时刷新您的 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/

相关文章:

c - 修改参数而不返回

JavaScript 未与 Perl CGI 一起运行

perl - 如何对用perlcc编译的Perl程序进行反向工程?

powershell - 如何访问数组内指定索引的元素的属性?

javascript - Phantomjs 进程间通信

c - 错误: incompatible types when initializing type 'struct taus88_t *' using type 'taus88_t' |?

c - 程序显示从 4 位数字到 Kaprekar 常数的无限循环过程

c - 对 union 中的字符进行 strcpy 时程序中止

perl - 如何使用 Perl 的 Net::LDAP 进行复杂查询?

c - 如何在写入前检查管道是否打开?