Я изучаю функции блокировки ввода-вывода для записи драйвера устройства linux, и мне интересно, что такое использование ERESTARTSYS
. Рассмотрим следующее:
Глобальная переменная:
wait_queue_head_t my_wait_q_head;
int read_avail = 0;
device_init():
init_waitqueue_head(&my_wait_q_head);
device_read():
printk("I'm inside driver read!\n");
wait_event_interruptible(&my_wait_q_head, read_avail != 0);
printk("I'm awaken!\n");
device_write():
read_avail = 1;
wake_up_interruptible(&my_wait_q_head);
Когда я вызываю read()
из пользовательского пространства, приглашение команды зависает, пока я не вызову write()
, как ожидалось. Сообщения printk
отображаются также в dmesg
. Тем не менее, я вижу некоторые из драйверов, написанных так:
Другая версия device_read():
printk("I'm inside driver read!\n");
if(wait_event_interruptible(&my_wait_q_head, read_avail != 0))
{return -ERESTARTSYS;}
printk("I'm awaken!\n");
Я тестировал вторую версию device_read()
, используя тот же метод в пользовательском пространстве, и результат точно такой же, так что, что такое использование ERESTARTSYS?
p/s: я прочитал книгу "Драйвер устройства Linux", но я не понимаю, может ли кто-нибудь дать пример для того, чтобы сделать несколько?:
Как только мы закончим этот звонок, что-то разбудило нас, но мы не Знаешь что. Одна из возможностей заключается в том, что процесс получил сигнал. if, который содержит проверку wait_event_interruptible call для этого случая. Это утверждение обеспечивает правильную и ожидаемую реакцию к сигналам, которые могли быть ответственны за пробуждение (поскольку мы были в прерывистом сне). Если сигнал имеет прибыл, и он не был заблокирован процессом, надлежащим поведение заключается в том, чтобы позволить верхним уровням ядра обрабатывать событие. к В этом случае драйвер возвращает -ERESTARTSYS вызывающему абоненту; это значение используемый внутренне уровнем виртуальной файловой системы (VFS), который либо перезапускает системный вызов или возвращает -EINTR в пользовательское пространство. Мы используем такой же тип проверки для обработки сигналов для каждого считывания и записать реализацию.