加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 03:22:34 所属栏目:百科 来源:网络整理
导读:我有两个独立的进程:一个C程序,输出逗号分隔值,后跟每秒一个换行符;一个Perl程序,接受数据(格式相同)并处理这些数据. C程序输出(通过printf)值如下: 1,2,3,4,5,6 7,8,9,10,11,12 ... Perl程序位于一个无限循环中,等待STDIN的行,以便处理这些数据: while (
我有两个独立的进程:一个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,6"
    # Process data
}

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

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

解决方法

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读