【发布时间】:2012-03-06 01:24:52
【问题描述】:
我正在学习编写 linux 设备驱动程序的阻塞 I/O 函数,我想知道ERESTARTSYS 的用途是什么。考虑以下几点:
全局变量:
wait_queue_head_t my_wait_q_head;
int read_avail = 0;
设备初始化():
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设备驱动程序,但我不明白,谁能举个例子来说明一下?:
一旦我们通过了那个电话,有些东西把我们吵醒了,但我们没有 知道什么。一种可能是进程收到了一个信号。这 包含 wait_event_interruptible 调用的 if 语句检查 对于这种情况。此声明确保正确和预期的反应 到信号,这可能是负责唤醒 进程(因为我们处于可中断的睡眠状态)。如果一个信号有 到达并且它没有被进程阻塞,正确的 行为是让内核的上层处理事件。到 为此,驱动程序将 -ERESTARTSYS 返回给调用者;这个值是 由虚拟文件系统 (VFS) 层在内部使用, 重新启动系统调用或将 -EINTR 返回到用户空间。我们使用 相同类型的检查来处理每次读取的信号处理和 编写实现。
【问题讨论】:
标签: c linux-kernel linux-device-driver