我有两个程序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
我的问题是:为什么第二个脚本在第一个脚本挂起时才起作用?
附带问题:当第二个版本工作时,只要我将脚本的输出重定向到文件,通信就不再交错,而是按进程排序。有办法防止这种情况吗?
答案 0 :(得分:0)
为什么第二个脚本在第一个脚本挂起时才起作用?
使用O_RDONLY或O_WRONLY设置打开FIFO时:
如果设置了O_NONBLOCK,则打开()仅供读取 应立即归还。只写打开() 如果当前没有进程打开文件,则返回错误 阅读。
如果O_NONBLOCK已清除,则打开()仅供读取 将阻塞调用线程,直到线程打开文件为止 写作。用于写入的 open ()将阻止调用 线程,直到线程打开文件进行读取。
在第一个脚本中,A
打开fifo1
,B
打开fifo2
,两者都打开O_RDONLY; A
阻止B
开启fifo1
进行写入,B
阻止A
阻止fifo2
开启A
进行写入...循环等待情况。 (实际上,炮弹打开了十五,但结果循环等待是相同的。)
在第二个脚本中,fifo1
打开B
,fifo2
打开tee
,同时打开O_RDONLY - 到目前为止与上面相同。但与此同时,第一个fifo2
打开tee
,第二个fifo1
打开A
进行撰写,从而取消阻止B
和… stdbuf -oL tee …
。
虽然第二个版本有效,但只要我重定向输出 脚本到文件,通信不再交错但是 按程序排序。有办法防止这种情况吗?
这可能是由于stdout缓冲造成的;尝试data: '{user: "' + $("#<%=username.ClientID%>")[0].value + '" }',
或发布您的输入和输出。