1

ファイル記述子fdを開いて /dev/random のその他のサニティ チェックを行った後、デバイスから読み取り可能なバイト数を読み取ろうとしています。これにより、プログラムで必要な場合にこの量を引き出すことができます。

私の基本的なコードはこれです:

if (fd = open("/dev/random", O_RDONLY) < 0) {
  perror("open");
  return 1;
}
...
if(ioctl(fd, FIONREAD, &n) < 0) { //file descriptor, call, unsigned int
  perror("ioctl");
  return 1;
}
printf("%d bytes available for reading.\n", n);
return 0;

どのようなシナリオ (必要な場合は root または通常のユーザー) であっても、常に読み取り可能な 0 バイトを返します。

これは、デバイスから取り出すことができるものを取得する方法であると以前に提案されましたが、プログラムで発生する可能性のある問題や障害によって、常にゼロが返されることを知っていますか? 私がやりたいことを行う他の方法を知っていますか?

4

1 に答える 1

2

どのLinuxバージョンを使用していますか?2.6.32では、プログラムの出力

ioctl:引数が無効です

FWIW、FIONREAD ioctlで見つけたドキュメントには、ソケット、パイプ、FIFO、およびtty用であると記載されています。/ dev / random、OTOHは文字特殊ファイルであるため、「無効な引数」errnoと組み合わせると、FIONREADは/ dev/randomではサポートされていないと思います。

いいえ、/ dev/randomで使用可能なバイト数を把握するための簡単な組み込みの方法はわかりません。動作する可能性のある1つのことは、別のスレッドが/ dev / randomからデータを読み取り、それをスレッドセーフキューに入れてから、キューがブロックされない方法で空であるかどうかを確認する方法を用意することです(たとえば、ビルドされます)。 pthread_mutex_trylock()の周り)。

于 2011-04-04T07:21:23.940 に答える