如何判断字符特殊文件读取时是否会阻塞

如何判断字符特殊文件读取时是否会阻塞

我希望能够判断如果从字符特殊文件中读取字符而不实际读取字符,该文件是否会阻塞。这可以做到吗?

答案1

您可以使用 0 超时从 bash 执行此操作read

if read -t 0
then read data
fi

要测试 stdin 以外的文件描述符(例如 3),请使用-u 3.要查找标准输入上准备了多少个字符,您可以使用一个小的 Perl 脚本:

#!/usr/bin/perl
require 'sys/ioctl.ph';
$size = pack("L", 0);
ioctl(*STDIN, FIONREAD(), $size) or die "ioctl fail: $!\n";
$size = unpack("L", $size);
print "stdin ready: $size\n";

答案2

POSIX 允许非阻塞、零字符读取,“可能检测并返回错误”,包括读取会阻塞:

如果此read操作在这种情况下检查错误,如果读取会阻塞,read则将返回 -1 并设置errnoEAGAIN(或者可能EWOULDBLOCK对于套接字,但您询问的是字符设备)。

答案3

在 C 或 C++ 中,您通常会用来pselect()测试是否有数据可供读取。您无需将文件描述符模式设置为非阻塞即可做到这一点。

相关内容