我想打开一个会写入命名管道的程序,但是直到某人实际从命名管道中读取它才会写入。这可以实现吗?我如何知道何时读取管道?
答案 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"