Linux:ioctl / FIONREAD在/ dev / random返回0字节?

时间:2011-04-04 05:54:28

标签: linux unix io posix ioctl

打开文件描述符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字节可供读取。

我一直suggested before这是一种检索我可以取出设备的方法,你知道我的程序中可能出现的问题或错误导致它总是返回零吗?你知道其他任何方法可以做我想做的事吗?

1 个答案:

答案 0 :(得分:2)

您使用的是哪个Linux版本?在2.6.32你的程序输出

ioctl:参数无效

FWIW,我已经能够找到FIONREAD ioctl的文档说它适用于套接字,管道,FIFO和tty。 / dev / random,OTOH,是一个字符特殊文件,因此结合“无效参数”errno我会说/ dev / random不支持FIONREAD。

不,我不知道有任何简单的内置方法来计算/ dev / random中的可用字节数。可能有用的一件事就是让一个单独的线程从/ dev / random读取数据并将其放入一个线程安全的队列中,然后有一种方法以非阻塞的方式检查队列是否为空(比如,构建)围绕pthread_mutex_trylock())。