今天我在阅读nc手册页时偶然发现了这个命令。我知道:
mkfifo /tmp/f正在/tmp/f创建命名管道。
cat /tmp/f正在打印写入该命名管道的任何内容,并且 的输出cat /tmp/f被通过管道传送到/bin/sh
/bin/sh正在交互运行,并且 stderr 被重定向到 stdout。运行时,连接到该端口(即 1234)上的远程服务器会打开 shell 提示符,客户端可以执行任意命令。但它是如何运作的呢?
我正在创建一个服务器和客户端情况,我想在其中创建一个管道,以便他们可以进行通信。
我在服务器代码中创建了管道
mkfifo("fifo",1755);:
问题是,稍后在服务器代码中,我打开了 fifo 以从中读取,open("fifo",O_RDONLY);但是当我执行它时,它向我显示了一个拒绝我访问 fifo 的错误。
我去看了管道fifo的权限,它是p-wx--s--t这样说的
:
p 代表管道,-表示用户没有阅读。我不知道当我用 7 给它的时候,s组执行有用户。我不知道如果我给了 1 那么它应该给用户和其他人只读取和执行的能力,而其他人没有预期的能力。我对权限有误解吗?
我尝试使用 -f 标志来测试命名管道是否存在
if [[ ! -f "$fifo" ]]; then
echo 'There should be a fifo.lock file in the dir.' > /dev/stderr
return 0;
fi
Run Code Online (Sandbox Code Playgroud)
这个检查似乎不正确。那么也许命名管道不是文件,而是其他东西?
来自 APUE
FIFO 可用于在一系列 shell 命令中复制输出流。这可以防止将数据写入中间磁盘文件(类似于使用管道避免中间磁盘文件)。
但是管道只能用于进程之间的线性连接,而 FIFO 有一个名称,因此它可以用于 非线性连接。
考虑一个需要处理过滤输入流两次的过程。
Run Code Online (Sandbox Code Playgroud)mkfifo fifo1 prog3 < fifo1 & prog1 < infile | tee fifo1 | prog2我们创建 FIFO,然后在后台启动 prog3,从 FIFO 中读取。然后我们启动 prog1 并使用 tee 将其输入发送到 FIFO 和 prog2。
FIFO 如何“在一系列 shell 命令中复制输出流”?这不是由teeFIFO 来完成的吗?
在示例中,mkfifo fifo1在当前目录中创建一个文件,并且fifo1似乎可以用常规文件替换。那么FIFO“防止将数据写入中间磁盘文件”的意义何在?
进程之间的“线性连接”和“非线性连接”是什么意思?FIFO可以用于非线性连接,而管道只能用于进程之间的线性连接是什么意思?
谢谢。