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

Cha*_*art 5 io files character-special-files

我希望能够判断一个字符特殊文件是否会阻止如果从它读取一个字符而不实际从中读取一个字符。这能做到吗?

meu*_*euh 7

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

if read -t 0
then read data
fi
Run Code Online (Sandbox Code Playgroud)

要测试 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";
Run Code Online (Sandbox Code Playgroud)

  • 在我的 4.3.42 版本中,手册页说 *如果 TIMEOUT 为 0,读取立即返回,而不尝试读取任何数据,* (3认同)

Ste*_*itt 6

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

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


小智 5

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