![我敢打赌我做错了什么和/或真的很愚蠢。](https://linux22.com/image/111068/%E6%88%91%E6%95%A2%E6%89%93%E8%B5%8C%E6%88%91%E5%81%9A%E9%94%99%E4%BA%86%E4%BB%80%E4%B9%88%E5%92%8C%2F%E6%88%96%E7%9C%9F%E7%9A%84%E5%BE%88%E6%84%9A%E8%A0%A2%E3%80%82.png)
编辑我: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
(它甚至会自行清理!)
那么,这个问题有多愚蠢呢?
答案1
你正在使用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;
}
(您还应该检查是否有错误。)