如何在bash中启动读写过程?

时间:2014-07-24 18:45:11

标签: linux bash unix process

背景:我必须恢复我的旧程序,遗憾的是,在与子进程通信方面失败了。该程序是用C ++编写的,并创建用于写入的子进程,打开管道进行读取。什么都没有崩溃,但没有数据可供阅读。

我的想法是在bash中重新创建整个场景,所以我可以交互式地检查发生了什么。

我在C ++中使用的东西:

  • mkfifo用于创建管道,有一个等同于bash的
  • popen用于创建子流程(在我的写法中)

    espeak -x -q -z 1> /dev/null 2> /tmp/my-pipe
    
  • openread - 打开管道然后阅读,我希望简单cat就足够了

  • fwrite - 写入子流程,只是重定向工作吗?

所以我希望openreadfwrite会很简单,但如何将程序作为一个流程启动(bash中的popen是什么?)< / p>

3 个答案:

答案 0 :(得分:1)

bash自然会使进程之间的管道变得非常容易,因此通常不需要创建和打开管道的命令

program1 | program2

这相当于运行popen("program2","w");的program1 它也可以通过运行popen("program1","r");

的program2来实现

如果您明确要使用命名管道:

 mkfifo /tmp/mypipe
 program1 >/tmp/mypipe  &
 program2 </tmp/mypipe  
 rm /tmp/mypipe

答案 1 :(得分:1)

可能解决原始问题的想法(并且考虑在shell中使用管道):

使用诸如popen,fwrite等的stdio命令涉及缓冲。如果管道写入端的程序只将少量数据写入管道,那么读取端的程序将不会看到任何数据,直到将完整的数据块写入管道,之后,数据块将沿管道推送。如果您希望数据尽快到达,则需要在写入端调用fflush(),或者如果您不打算再发送数据,则需要fclose()。请注意,使用bash,我不相信有任何相同的fflush。

答案 2 :(得分:0)

您只需在后台运行该过程。

espeak -x -q -z >/dev/null 2>/tmp/mypipe &