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

标签 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这是一种检索我可以从设备中取出的东西的方法,你知道我的程序中可能有什么问题或错误导致它总是返回零吗?你知道还有其他方法可以做我想做的事吗?

最佳答案

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

ioctl: 无效参数

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

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

关于Linux:ioctl/FIONREAD 返回 0 字节可用在/dev/random?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5535030/

相关文章:

ios - 如何将 NSNumber 转换为 NSString rwx 类型

php - 通过 php 读取二进制文件并通过 shell 上的 exec 保存它

java - 扫描仪与 FileInputStream

Java 控制台 readPassword() 返回无意义的字符

java - ObjectInputStream.readObject 导致 EOFException

带有提示的 Linux 命令行问题

arrays - 重置数组并用 bash 脚本中的值填充它

linux - iptables 下降长度和 TTL 条件不起作用

子进程与父进程之间的通信

regex - 如何使用 egrep 用逗号和数字搜索特定模式