读书人

关于驱动中read拥塞放进内核等待队列的

发布时间: 2012-09-01 09:33:03 作者: rapoo

关于驱动中read阻塞放进内核等待队列的的疑问
驱动中
bool have_data = false;


read
while (!have_data)
{
if (filp->f_flags & O_NONBLOCK)
return -EAGAIN;

wait_event_interruptible(dev->inq,have_data);
}
先运行测试程序 app-read 时会阻塞在这里

驱动中的write
copy from usr...............
have_data = true; /* 有新的数据可读 */

/* 唤醒读进程 */
wake_up(&(dev->inq));


接着运行 app-write
部分代码如下
fwrite(Buf, sizeof(Buf), 1, fp);
sleep(5);
fclose(fp);

问题1 为什么5秒后 app-read 才被唤醒 驱动中没有sleep(5)啊
问题2 先运行完app-write 再运行app-read 不阻塞可以读到数据,再次运行app-read又阻塞了,又是什么情况
问题3 app-read 阻塞时 ctrl+c 为什么会死机

可能描述的不是很清楚,大家包涵



[解决办法]
在write驱动中改变have_data后,马上printk打印变量
在read驱动中wait_event_interruptible(dev->inq,have_data);下加一条printk打印语句

然后你用dmesg观察下write那边打印后,read那边是否马上唤醒(即马上打印),然后看看打印出来的值变了没有。
[解决办法]
因为你调用fwrite,数据并没有写到文件,而是写到你程序的缓存

直到你调用了fclose时才真正将数据刷到文件(具体什么时候fwrite会将数据写到文件,你可以再找相关资料看)

读书人网 >C语言

热点推荐