読み取り時に文字特殊ファイルがブロックされているかどうかを確認する方法

読み取り時に文字特殊ファイルがブロックされているかどうかを確認する方法

実際に文字を読み取らずに特殊文字ファイルから文字を読み取る場合は、ファイルがブロックされているかどうかを知ることができます。これは可能ですか?

答え1

0 timeoutを使用してbashでこれを行うことができますread

if read -t 0
then read data
fi

stdin以外のファイル記述子(例:3)をテストするには、を使用します-u 3。 stdinで準備された文字数を確認するには、小さな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は、対応するブロック読み取りを含む「エラーを検出して返すことができる」非ブロック、ゼロ文字の読み取りを許可します。

  • open(2)デバイスがO_NONBLOCKingモードになっています。
  • read(2)数は0です。

このread操作でエラーを確認すると、read-1が返され、読み取りがブロックされているかどうか(またはソケットの場合ですが文字デバイスについて尋ねられた場合)errnoに設定されます。EAGAINEWOULDBLOCK

答え3

C または C++ では、通常、pselect()読み取るデータがあるかどうかをテストします。このために、ファイル記述子モードを非ブロックに設定する必要はありません。

関連情報