我正在尝试使用命名管道作为一种方便的方式来动态预处理管道的输入,遗憾的是这些管道不能直接接受来自标准输入的数据。
无论我在哪里寻找信息,我得到的基本都是相同的要点:命名管道应该非常容易使用。
要点主要是以下内容应该起作用:
mkfifo mynamedpipe echo "is this working?" > mynamedpipe cat mynamedpipe
当我运行时mkfifo mynamedpipe
,管道已成功创建并可见ls *
。
但即使在我授予自己对该管道的写权限之后,当我尝试运行时,echo "whatever" > mynamedpipe
什么也没有发生,并且终端只是挂起,直到我用 终止该进程ctrl+c
。
我在本地 Linux 机器(Ubuntu 14.04.5 LTS)以及公共服务器(Red Hat Enterprise Linux 7)以及 zsh 和 bash 中都遇到了这个问题。
我在这里做错了什么?
答案1
这篇文章似乎与您的问题有关: Cat 到命名管道导致挂起。
相关评论如下:
- 你需要从 FIFO 中读取一些东西
- 确保管道创建时有足够大的缓冲区或读取器速度足够快以避免阻塞
您需要将管道分配给文件描述符,如下所示:
exec 3<>/tmp/stream_pipe