C

/dev/urandom 每次都返回相同的值

  • May 8, 2017

編輯 I: Linux 的 Windows 子系統。


我敢打賭我做錯了什麼和/或真的很愚蠢。

// random_problems.c

#include <stdio.h>

main(){
 int rng;
 FILE * urnd = fopen("/dev/random", "r");
 read(urnd, &rng, 1);
 close(urnd);
 printf("%d\n", rng);
}

$ ./random_problems
32767
$ ./random_problems
32767
$ ./random_problems
32767

每次都是一樣的結果。

是的,我檢查了:/dev/random 正在改變。(添加了換行符)

[~] Connor >> head /dev/random -c 1
P
[~] Connor >> head /dev/random -c 1
m

我遇到了同樣的問題/dev/urandom

我用這個小腳本把事情循環起來:

echo "32767" > 32767; while [ $? -eq 0 ]; do ./random_problems > rng; diff -s rng 32767; done; rm rng 32767

(它甚至會自行清理!)


那麼,這個問題有多愚蠢呢?

當它需要一個文件描述符時,您正在使用read指針:FILE

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

您需要添加一些標頭,並且您最好讀取適合您的字節數int

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main(int argc, char **argv){
 int rng;
 int urnd = open("/dev/random", O_RDONLY);
 read(urnd, &rng, sizeof(int));
 close(urnd);
 printf("%d\n", rng);
 return 0;
}

(您還應該檢查錯誤。)

引用自:https://unix.stackexchange.com/questions/363570