Что использует ERESTARTSYS при написании драйвера Linux?

Я изучаю блокирующие функции ввода-вывода для написания драйвера устройства 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 в пространство пользователя. Мы используем один и тот же тип проверки для обработки сигналов для каждого чтения и написать реализацию.

Источник: http://www.makelinux.net/ldd3/chp-6-sect-2

29
задан I'm a frog dragon 6 March 2012 в 01:24
поделиться