[求助]关于阻塞型IO和休眠驱动
小弟在测试中有以下代码:void sighandler(int signo){
if (signo==SIGIO)
gotdata++;
return;
}
int main(int argc, char **argv)
{
struct sigaction action;
if ((pipetest0 = open("/dev/scullpipe0",O_RDONLY)) < 0) {
printf("open scullpipe0 error! \n");
exit(1);
}
memset(&action, 0, sizeof(action));
action.sa_handler = sighandler;
action.sa_flags = 0;
sigaction(SIGIO, &action, NULL);
fcntl(pipetest0, F_SETOWN, getpid());
fcntl(pipetest0, F_SETFL, fcntl(pipetest0, F_GETFL) | FASYNC);
sleep(86400);在上面的函数中,更改打开文件的所有者,并且设置FASYNC标志,将钩子函数sighandler赋值给action结构体成员,然后睡眠。
而在驱动程序中,有如下一句代码:kill_fasync(&dev->async_queue, SIGIO, POLL_IN);发送给设备文件所有者一个SIGIO信号,唤醒测试程序所在进程,并且会调用钩子函数sighandler,根据发送的信号,来使gotdata加一,
但这个时候遇到问题了,就是在驱动程序的kill_fasync()函数中,无论我发送什么信号,gotdata都会加一,意思就是说,无论我在kill_fasync()函数中怎么修改信号者,传递给钩子函数的sighandler()的信号,都是SIGIO,这是为什么呢?
页:
[1]