1

/dev/random から真の乱数を収集しようとしています。これが私の簡単なコードです:

u_char buf[256];

memset(buf, 0, 256);

int dev = open("/dev/random", O_RDONLY);

int nbr = read(dev, buf, 100);

printf("Number of bytes returned : %d\n", nbr);

ご覧のとおり、100 のランダム バイトを要求していますが、このプログラムを実行すると、常に 15 から 30 の範囲の変数nbrに出力が得られます。これは、/dev/random に常に十分なエントロピーがあるとは限らないため理解できますが、 read() の際、/dev/random はバッファが 100 ランダム バイトになるまでブロックする必要がありますが、この場合は発生せず、プログラムはブロックされません。/dev/random の man ページを読みました。それは言う

エントロピー プールがの場合、 /dev/random からの読み取りは、追加の環境ノイズが収集されるまでブロックされます。

これは文字通り、エントロピー プールがの場合にのみ /dev/random がブロックされ、必要なバイト数よりも少ないかどうかに関係なく、データ量がある場合はブロックされないことを意味しますか?

どんな助けでも大歓迎です。

4

4 に答える 4

5

これは に特別なこと/dev/randomではなく、 の動作ですread。パラメータはバッファ サイズであり、readそのサイズまで利用可能なものを返します。

FILE*代わりにandを使用してfread、100 バイトの 1 ブロックを読み取ることを検討してください。

于 2012-11-02T06:47:24.847 に答える
2

つまり、読み取るデータがない場合を除き、読み取りはブロックされません。たとえそれがあなたが望むよりも少ないデータであっても、それは常にそれが読み取ることができた量またはエラーを返します.

于 2012-11-02T08:44:39.267 に答える
1

プログラムは から 100 バイトを読み取っています/dev/random。何らかの手動操作 (たとえば、コマンドを入力するか、bash の場合は単純に矢印キーを押す) で再起動すると、その手動操作 (一連のキー押下) によって のエントロピー プールが供給されますrandom(4)。したがって、ブロッキングケースになることはありません。

また、適用されるread(2)システムコールのセマンティクスは、/dev/randomいくつかのバイトを読み取ろうとすることです。少なくとも 1 バイトが読み取られた場合、read(2)syscall は成功し、ブロックされません。

また、私がコメントしたように、最近の十分なハードウェアと十分な最近のカーネルには、ブロックしない可能性のある十分なランダム ソースがありrandom(4)ます。

于 2012-11-02T07:56:28.230 に答える