首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2012-09-01 
关于驱动中read阻塞放进内核等待队列的的疑问驱动中bool have_data falsereadwhile (!have_data){if (f

关于驱动中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会将数据写到文件,你可以再找相关资料看)

热点排行