只有当它已经有一个阅读器时,我才想写入一个命名管道。目前,我正在使用timeout
来检测写入管道的尝试是否被阻止,如下所示:
#! /usr/bin/env bash
rm -f pipe
mkfifo pipe
sleep 5
timeout 1 bash -c "echo Hello > pipe"
if [[ $? == 0 ]]
then
echo Somebody got our message
else
echo Nobody read from pipe, so we didn\'t send a message
fi
这行得通。如果我tail -f pipe
在睡眠期间处于单独的终端中,我会收到一条消息,如果我没有,我会收到另一条消息。但是有更好的方法吗?理想情况下,这将是不依赖于超时的东西。
如果要写入管道,只有在有进程打开它进行读取时,才能以非阻塞模式打开它进行写入。
使用 GNU
dd
:如果没有阅读器,您将收到 ENXIO 的错误消息(类似于英语中的No such device or address )。
请注意,如果管道已满(如果有读取器,但当前未读取并且已写入 64KiB 之类的内容),它也会失败(使用
EWOULDBLOCK
/EAGAIN
,Resource 暂时不可用)。另请注意,如果不合适,可能不会写入所有消息。如果你删除
status=none
,你会看到写了多少。