我写了一个简单的application它有两个线程。第一个线程打印到标准输出,第二个线程从标准输入读取。
我已将进程的 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吗? ?
我想在不完全阻止应用程序的情况下运行我的应用程序的问题的解决方法是什么。我只希望等待用户输入的线程被阻塞,其他线程继续执行。
此应用程序在启动时启动。因此,该应用程序应该在运行时不会因用户输入而被阻止。用户可以随时使用“cat > pipe_in”开始提供输入以获取有关此应用程序的一些详细信息。
最佳答案
重定向由 shell 在启动应用程序之前完成。因此 a.out
不会启动,也不会创建任何线程来做任何事情,直到管道的打开完成,并且管道写入端(对于 1 和 2)的打开直到阅读面打开。 (0 的读端打开会立即完成。)
关于linux - 将 stderr、stdout 和 stdin 重定向到管道会阻止进程运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45928299/