linux - 将 stderr、stdout 和 stdin 重定向到管道会阻止进程运行

标签 linux bash shell

我写了一个简单的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/

相关文章:

c - 无法将标准输出置于宽字符模式

bash - 如何计算 bash 中字符串(url)的哈希值以进行 wget 缓存

python - 将唯一指纹附加到文件

linux - 检查目录是否存在不起作用

linux - 在 windows 和 linux 上都会成功的命令,但会给出不同的结果

php - 如何计算 PHP 脚本(linux)中的处理器内核数?

linux - Grep(或替代)2个字符串,匹配一个,另一个或两者都成功,包含任何其他内容是失败的

linux - libtasn1 未找到,但我已经安装了

linux - 我的自定义 init shell 脚本停止部署脚本

linux - 如何在没有密码的情况下使用命令 "sudo adduser test"?