我如何知道写入命名管道是否会阻塞?

我如何知道写入命名管道是否会阻塞?

仅当命名管道已有读取器时,我才想写入该管道。目前,我正在用来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在睡眠期间使用单独的终端,我会收到一条消息,如果没有,我会收到另一条消息。但还有更好的办法吗?理想情况下,它应该是不依赖超时的东西。

答案1

如果你想写入管道,只有当有某个进程打开它进行读取时,你才可以以非阻塞模式打开它进行写入。

使用 GNU dd

echo Hello | dd oflag=nonblock of=pipe status=none &&
  echo message has been sent

您将收到 ENXIO 的错误消息(类似于没有这样的设备或地址英文)如果没有读者。

请注意,它也会失败(使用EWOULDBLOCK/ EAGAIN资源暂时不可用)如果管道已满(如果有读取器,但当前未读取并且已写入 64KiB 之类的内容)。

另请注意,如果不适合,则无法写入所有消息。如果删除status=none,您将看到写入了多少内容。

相关内容