将stderr,stdout和stdin重定向到管道阻止了进程运行

时间:2017-08-28 22:42:26

标签: linux bash shell

我写了一个简单的application,它有两个主题。第一个线程是打印到stdout,第二个线程是从stdin读取。

我已将流程的stdin,stdout和stdin重定向到3个不同的管道,如下所示。

mkfifo pipe_in && mkifo pipe_out && mkfifo pipe_err

./a.out < pipe_in 2> pipe_err 1> pipe_out &

问题是我的这个应用程序(./a.out)被阻止运行,直到我执行以下操作:

cat < pipe_out &
cat < pipe_err &
cat > pipe_in

为什么此应用程序被阻止?是因为来自其他方面的身体没有打开pipe吗?

我希望在没有完全阻止的情况下运行应用程序的问题的解决方法是什么。我只希望只有等待用户输入的线程被阻塞而其他线程继续执行。

此应用程序在启动时启动。因此,应该运行此应用程序而不会阻止用户输入。用户可以随时使用&#34; cat&gt; pipe_in&#34;开始提供输入以获取有关此应用程序的一些详细信息。

1 个答案:

答案 0 :(得分:1)

在启动应用程序之前,shell完成重定向。因此a.out无法启动,并且无法创建任何执行任何操作的线程,直到管道的打开完成,并且管道写入侧(对于1和2)的打开在读取侧打开之前不会完成。 (0的读取方面的打开确实立即完成。)