В Linux существует концепция синхронного опроса для нескольких файлов устройств, и я пытаюсь понять, как это работает.
в исходных драйверах linux 2.6.23/char/random.c я вижу следующий код.
static DECLARE_WAIT_QUEUE_HEAD(random_read_wait);
static DECLARE_WAIT_QUEUE_HEAD(random_write_wait);
static unsigned int
random_poll(struct file *file, poll_table * wait)
{
unsigned int mask;
poll_wait(file, &random_read_wait, wait);
poll_wait(file, &random_write_wait, wait);
mask = 0;
if (input_pool.entropy_count >= random_read_wakeup_thresh)
mask |= POLLIN | POLLRDNORM;
if (input_pool.entropy_count < random_write_wakeup_thresh)
mask |= POLLOUT | POLLWRNORM;
return mask;
}
poll_table определяется, как показано ниже, в include/linux/poll.h
typedef void (*poll_queue_proc)(struct file *, wait_queue_head_t *, struct poll_table_struct *);
typedef struct poll_table_struct {
poll_queue_proc qproc;
} poll_table;
Я видел в книге (глава 5, Essential Linux Device Drivers, Venkateswaran), что «таблица poll_table — это таблица очередей ожидания, принадлежащая драйверам устройств, которые опрашиваются для получения данных». но источник говорит, что это просто указатель на функцию. и я не могу найти, что делает эта функция qproc. Ниже представлена функция poll_wait, определенная в include/linux/poll.h.
static inline void poll_wait(struct file * filp, wait_queue_head_t * wait_address, poll_table *p)
{
if (p && wait_address)
p->qproc(filp, wait_address, p);
}
и в книге говорится (о примере драйвера char для мыши): «mouse_poll() использует библиотечную функцию poll_wait(), чтобы добавить очередь ожидания (mouse_wait) в poll_table ядра и перейти в спящий режим». так что poll_wait может спать, но в приведенной выше функции random_poll() мы видим две последовательные функции poll_wait. так что random_poll последовательно опрашивает доступность для чтения и записи и отправляет маску в приложение? Буду признателен, если кто-нибудь покажет мне пример функции poll_queue_proc. Я не смог найти его в источнике драйвера Linux (он должен отображаться только в приложении?).