背景:我必须恢复我的旧程序,遗憾的是,在与子进程通信方面失败了。该程序是用C ++编写的,并创建用于写入的子进程,打开管道进行读取。什么都没有崩溃,但没有数据可供阅读。
我的想法是在bash中重新创建整个场景,所以我可以交互式地检查发生了什么。
我在C ++中使用的东西:
mkfifo
用于创建管道,有一个等同于bash的 popen
用于创建子流程(在我的写法中)
espeak -x -q -z 1> /dev/null 2> /tmp/my-pipe
open
和read
- 打开管道然后阅读,我希望简单cat
就足够了
fwrite
- 写入子流程,只是重定向工作吗?所以我希望open
,read
和fwrite
会很简单,但如何将程序作为一个流程启动(bash中的popen
是什么?)< / p>
答案 0 :(得分:1)
bash自然会使进程之间的管道变得非常容易,因此通常不需要创建和打开管道的命令
program1 | program2
这相当于运行popen("program2","w");
的program1
它也可以通过运行popen("program1","r");
如果您明确要使用命名管道:
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 &