- 论坛徽章:
- 0
|
MagicBoy2010 发表于 2012-03-13 17:18 ![]()
靠,for(; 分号)居然还有表情,CU真是太强悍了
请教下:
在这个例子代码中, 你可找到一
个称为 sleepy 的模块. 它实现一个有简单行为的设备:任何试图从这个设备读取的进程
都被置为睡眠. 无论何时一个进程写这个设备, 所有的睡眠进程被唤醒. 这个行为由下面
的 read 和 write 方法实现:
static DECLARE_WAIT_QUEUE_HEAD(wq);
static int flag = 0;
ssize_t sleepy_read (struct file *filp, char __user *buf, size_t count, loff_t
*pos)
{
printk(KERN_DEBUG "process %i (%s) going to sleep\n",
current->pid, current->comm);
wait_event_interruptible(wq, flag != 0);
flag = 0;
printk(KERN_DEBUG "awoken %i (%s)\n", current->pid, current->comm);
return 0; /* EOF */
}
ssize_t sleepy_write (struct file *filp, const char __user *buf, size_t count,
loff_t *pos)
{
printk(KERN_DEBUG "process %i (%s) awakening the readers...\n",
current->pid, current->comm);
flag = 1;
wake_up_interruptible(&wq);
return count; /* succeed, to avoid retrial */
}
有趣的是考虑当 sleepy_write 被调用时如果有 2 个进程在等待会发生什么. 因为
sleepy_read 重置 flag 为 0 一旦它醒来, 你可能认为醒来的第 2 个进程会立刻回到睡
眠. 在一个单处理器系统, 这几乎一直是发生的事情
红色字体是为什么??想不通,2个都唤醒了,为什么第二个会睡眠?当第一个醒了后,flag=0 ,那又如何?难道read()函数会被调用2次吗???? |
|