Linux 命名管道 - MKFIFO 查询

Posted

技术标签:

【中文标题】Linux 命名管道 - MKFIFO 查询【英文标题】:Linux Named Pipes - MKFIFO query 【发布时间】:2018-08-01 12:20:43 【问题描述】:

我在命名 Linux BASH、命名管道等方面相当新。 我正在关注本文中的一个示例: https://www.linuxjournal.com/content/using-named-pipes-fifos-bash 一切正常,符合预期。然而,这仅仅是开始。 我希望能够从 reader 调用 writer 脚本以在管道中的 2 个脚本之间传递信息,而无需为 writer 脚本创建 cron 作业。

这个想法是有人在没有提升权限的情况下触发阅读器脚本。 阅读器调用具有一些硬编码 sudo 用户(用于测试目的)的编写器,评估数据并将结果返回给阅读器。 任何建议表示赞赏。

【问题讨论】:

请解释链接的内容,以便其他人无需点击即可回答您的问题。链接容易腐烂。 【参考方案1】:

据我了解,您需要以下内容:

    一个编写器,它侦听将数据写入命名管道的请求。 读取器向写入器发送数据请求,并从命名管道读取数据。 写入器进程应以特权用户身份运行,读取器应以低特权用户身份运行。

1 和 2 可以使用以下脚本,其中:

编写器在后台运行并监听请求:sh writer.sh & 读取器运行时,它会向写入器发送信号以触发将数据写入命名管道 阅读器随后从管道中读取数据并输出数据。

3 是不可能的,因为:

具有较低权限的进程无法向具有较高权限的进程发送信号。见this 或者,由具有较低权限的用户运行的脚本无法启动另一个具有较高权限的脚本(即阅读器无法启动具有较高权限的写入器)

writer.sh

#!/bin/bash

# Store the value of the writer process
echo $$ > /tmp/pid
# Specify location of named pipe
pipe=/tmp/datapipe

# Create Data pipe if it doesn't exist
if [[ ! -p $pipe ]]; then
   echo "Pipe does not exist. Creating..."
   mkfifo $pipe
fi

# Send data to pipe
echo "Hello" >$pipe

# Send data to pipe based on trigger
function write_data 
   echo "Writing data"
   echo "Here is some data" >$pipe &


# Kill process based on trigger
function kill 
   echo "Exiting"
   exit


# Listen for signals
trap write_data SIGINT
trap kill KILL

# listen
while true; do
   sleep 1;
done

reader.sh

#!/bin/bash
pipe=/tmp/datapipe

# Read the writer pid
pid=$(cat /tmp/pid)  

# Trigger writer to create data
kill -s SIGINT $pid

# Read data from named pipe
if read line <$pipe; then
   echo $line
fi

【讨论】:

感谢您的评论。我最终决定让守护程序脚本在启动时运行。该脚本将监控管道,当有东西通过时,它会触发特定的操作。

以上是关于Linux 命名管道 - MKFIFO 查询的主要内容,如果未能解决你的问题,请参考以下文章

linux命令命名管道(mkfifo)+ 结合xargs命令使用

linux C语言mkfifo()函数 mkfifoat()函数(制作一个 FIFO 特殊文件(命名管道))

命名管道类似于“mkfifo”创建,但双向

linux面试

mkfifo 读写错误

说解在shell中通过mkfifo创建命名管道来控制多个进程并发执行