免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1856 | 回复: 0
打印 上一主题 下一主题

[求助]关于阻塞型IO和休眠驱动 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-29 11:47 |只看该作者 |倒序浏览
小弟在测试中有以下代码:
  1. void sighandler(int signo)
  2. {   
  3.    if (signo==SIGIO)
  4.        gotdata++;
  5.     return;
  6. }

  7. int main(int argc, char **argv)
  8. {

  9.     struct sigaction action;
  10.    if ((pipetest0 = open("/dev/scullpipe0",O_RDONLY)) < 0)        {
  11.                  printf("open scullpipe0 error! \n");
  12.                 exit(1);
  13.         }

  14.     memset(&action, 0, sizeof(action));
  15.     action.sa_handler = sighandler;
  16.     action.sa_flags = 0;

  17.     sigaction(SIGIO, &action, NULL);

  18.     fcntl(pipetest0, F_SETOWN, getpid());
  19.     fcntl(pipetest0, F_SETFL, fcntl(pipetest0, F_GETFL) | FASYNC);
  20.    sleep(86400);
复制代码
在上面的函数中,更改打开文件的所有者,并且设置FASYNC标志,将钩子函数sighandler赋值给action结构体成员,然后睡眠。

而在驱动程序中,有如下一句代码:
  1. kill_fasync(&dev->async_queue, SIGIO, POLL_IN);
复制代码
发送给设备文件所有者一个SIGIO信号,唤醒测试程序所在进程,并且会调用钩子函数sighandler,根据发送的信号,来使gotdata加一,
  
但这个时候遇到问题了,就是在驱动程序的kill_fasync()函数中,无论我发送什么信号,gotdata都会加一,意思就是说,无论我在kill_fasync()函数中怎么修改信号者,传递给钩子函数的sighandler()的信号,都是SIGIO,这是为什么呢?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP