web-dev-qa-db-ja.com

から読み取った場合に文字特殊ファイルがブロックされるかどうかを確認する方法

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

5
Charles Stewart

readへの0タイムアウトを使用してbashからこれを行うことができます。

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";
7
meuh

POSIXは、読み取りがブロックすることを含め、「エラーを検出して返す可能性がある」非ブロックのゼロ文字読み取りを許可します。

  • open(2) _O_NONBLOCK_ ingモードのデバイス;
  • read(2) 0のカウント。

このread操作がそのような場合にエラーをチェックする場合、読み取りがブロックされると、readは-1を返し、errnoEAGAIN(またはおそらくソケットの場合はEWOULDBLOCKですが、キャラクターデバイスについて質問しています)。

6
Stephen Kitt

CまたはC++からは、通常、pselect()を使用して、読み取る準備ができているデータがあるかどうかをテストします。ファイル記述子モードを非ブロッキングに設定しなくても、これを行うことができます。

5
peterq