Linux: ioctl / FIONREAD возвращает 0 байтов, доступных в / dev / random? - PullRequest
1 голос
/ 04 апреля 2011

После открытия дескриптора файла 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;

Независимо от того, какой сценарий (в качестве обычного или обычного пользователя в случае необходимости) он всегда возвращает 0 байтов, доступных для чтения.

До мне предлагалось *1000* предположить, что это метод для извлечения того, что я могу извлечь из устройства. Знаете ли вы, какие возможные проблемы или сбои в моей программе приводят к тому, что оно всегда возвращает ноль?Знаете ли вы какие-либо другие способы сделать то, что я хочу сделать?

1 Ответ

2 голосов
/ 04 апреля 2011

Какую версию Linux вы используете?В 2.6.32 ваша программа выводит

ioctl: неверный аргумент

FWIW, документация, которую мне удалось найти, с помощью FIONREAD ioctl говорит, что она предназначена для сокетов, каналов, FIFO и tty.,/ dev / random, OTOH, это специальный символьный файл, поэтому в сочетании с «неверным аргументом» errno я бы сказал, что FIONREAD не поддерживается для /dev/random.

И нет, я не знаюлюбого простого встроенного способа выяснить количество доступных байтов в / dev / random.Единственное, что может сработать, - это иметь отдельный поток, считывающий данные из / dev / random и помещающий их в потокобезопасную очередь, а затем иметь способ проверить, пуста ли очередь неблокирующим способом (скажем, встроеннымвокруг pthread_mutex_trylock ()).

...