Я изучаю блокирующие функции ввода-вывода для написания драйвера устройства 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 Device Driver, но не понял, может кто-нибудь привести пример для уточнения? :
Как только мы минуем этот звонок, что-то разбудит нас, но мы не Знаешь что. Одна из возможностей состоит в том, что процесс получил сигнал. То оператор if, содержащий проверки вызовов wait_event_interruptible для этого случая. Это утверждение обеспечивает правильную и ожидаемую реакцию сигналам, которые могли быть ответственны за пробуждение процесса (поскольку мы были в прерывистом сне).Если сигнал имеет прибыл и не был заблокирован процессом, надлежащее поведение заключается в том, чтобы позволить верхним уровням ядра обрабатывать событие. К с этой целью драйвер возвращает -ERESTARTSYS вызывающей стороне; это значение используется внутри уровнем виртуальной файловой системы (VFS), который либо перезапускает системный вызов или возвращает -EINTR в пространство пользователя. Мы используем один и тот же тип проверки для обработки сигналов для каждого чтения и написать реализацию.