如何在读取时为linux中的命名管道运行命令?

时间:2012-07-04 08:51:38

标签: linux named-pipes

我想打开一个会写入命名管道的程序,但是直到某人实际从命名管道中读取它才会写入。这可以实现吗?我如何知道何时读取管道?

3 个答案:

答案 0 :(得分:2)

写入管道实际上会阻塞,直到有人从管道中读取

$ mkfifo f
$ printf "%s\n" "a" "b" "c" "d" > f & # on bg otherwise it blocks until someone reads it
$ cat < f
a
b
c
d
[1]+  Done                    printf "%s\n" "a" "b" "c" "d" > f

因此,您知道在上述示例中printf 完成时读取管道的时间。


所以等待一旦有人从管道中读取命令就可以实现

printf "%s\n" > f && run_some_command

但是如果命令只是将数据发送到管道(这里推测),你可以直接发送数据,因为只有当有人从管道读取时才会发送数据

some_command > f # will block until f is read from

另一种查找 if和who 正在读取或写入管道的方法是lsof。尝试

$ lsof f

所有读取或写入f的进程都将列出其pid,进程名称,读取或写入操作..请参阅手册页。

答案 1 :(得分:1)

我认为除了实现锁文件或其他信号量/标志之外,还有一种方法可以判断命名管道是否有监听器。但是,您可能能够在另一个方向上检测到事物。 Linus Akesson wrote a blog post关于使用管道来模拟逻辑门。 (这是一个引人入胜的,超级怪异的阅读。)为了实现他的想法,他需要编写一个工具,检查管道是否有数据等待,而不实际从管道中取出数据。

您可以获取他的代码,为您的平台编译它,然后有一个工具只有在确认数据等待通过它发送后才从管道中读取。在不知道你真正想要实现的目标的情况下,我不知道这个解决方案是否适用于你的实际问题。

底线是命名管道没有缓冲,并且在不使用特定于平台的黑客攻击的情况下不提供状态指示。发送过程将等待接收方,或者接收过程将等待发送方等。

您可能希望使用比命名管道更高级的消息传递系统。

答案 2 :(得分:0)

命名管道在文件系统中可见,可以像其他文件一样进行读写:

$ ls -la /tmp/testpipe
prw-r--r-- 1 mitch users 0 2009-03-25 12:06 /tmp/testpipe|

命名管道是通过mkfifo或mknod:

创建的
$ mkfifo /tmp/testpipe
$ mknod /tmp/testpipe p

以下shell脚本从管道中读取。它首先创建管道,如果它不存在,然后它读入一个循环,直到它看到“退出”:

#!/bin/bash

pipe=/tmp/testpipe

trap "rm -f $pipe" EXIT

if [[ ! -p $pipe ]]; then
    mkfifo $pipe
fi

while true
do
    if read line <$pipe; then
        if [[ "$line" == 'quit' ]]; then
            break
        fi
        echo $line
    fi
done

echo "Reader exiting"