我敢打赌我做错了什么和/或真的很愚蠢。

我敢打赌我做错了什么和/或真的很愚蠢。

编辑我: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

你正在使用readFILE当需要文件描述符时,使用指针:

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;
}

(您还应该检查是否有错误。)

相关内容