Bash:链接两个进程的I / O.

时间:2014-12-12 08:51:58

标签: bash process fifo

我有两个程序A和B(在我的例子中是一个C程序和一个Java程序),它们应该相互通信。这些程序的bash脚本中的调用如下所示:

mkfifo fifo1
mkfifo fifo2

A < fifo1 > fifo2 &
java B < fifo2 > fifo1

我知道我可以用一个fifo来做,但我也希望能够在控制台上显示通信。以下工作正常:

mkfifo fifo1
mkfifo fifo2

A < fifo1 | tee fifo2 &
java B < fifo2 | tee fifo1

我的问题是:为什么第二个脚本在第一个脚本挂起时才起作用?

附带问题:当第二个版本工作时,只要我将脚本的输出重定向到文件,通信就不再交错,而是按进程排序。有办法防止这种情况吗?

1 个答案:

答案 0 :(得分:0)

  

为什么第二个脚本在第一个脚本挂起时才起作用?

man open

  

使用O_RDONLY或O_WRONLY设置打开FIFO时:

     

  • 如果设置了O_NONBLOCK,则打开()仅供读取   应立即归还。只写打开()   如果当前没有进程打开文件,则返回错误   阅读。

  •      

  • 如果O_NONBLOCK已清除,则打开()仅供读取   将阻塞调用线程,直到线程打开文件为止   写作。用于写入的 open ()将阻止调用   线程,直到线程打开文件进行读取。

  • 在第一个脚本中,A打开fifo1B打开fifo2,两者都打开O_RDONLY; A阻止B开启fifo1进行写入,B阻止A阻止fifo2开启A进行写入...循环等待情况。 (实际上,炮弹打开了十五,但结果循环等待是相同的。)

    在第二个脚本中,fifo1打开Bfifo2打开tee,同时打开O_RDONLY - 到目前为止与上面相同。但与此同时,第一个fifo2打开tee,第二个fifo1打开A进行撰写,从而取消阻止B… stdbuf -oL tee …

      

    虽然第二个版本有效,但只要我重定向输出   脚本到文件,通信不再交错但是   按程序排序。有办法防止这种情况吗?

    这可能是由于stdout缓冲造成的;尝试data: '{user: "' + $("#<%=username.ClientID%>")[0].value + '" }', 或发布您的输入和输出。