Linux字符设备驱动 异步通知
枫叶雪 2015-03-19 04:15:03 发现一个不理解的问题啊~
加了fcntl,有的信号的默认响应不能改吗??
详情如下:
写了一个字符设备的驱动,向外使用kill_fasync(&dev->async-queue, SIGIO, POLL_IN)发送信号,信号也的确送到了上层。在上层我使用signal更改了信号的默认操作,并使用fcntl更改文件的所有者进程为当前进程,并添加异步通知标志,类似如下:
signal(SIGIO, signal_handler);
fcntl(fd, F_SETOWN, getpid());
oflags = fctnl(fd, F_GETFL);
fctnl(fd, F_SETFL, oflags | FASYNC);
应用程序也的确受到了SIGIO,并且执行了signal_handler。
到这里一切正常。。。
但是!
但是!
如果我换了一个信号(不用SIGIO了)比如SIGHUP、SIGRTMIN+1等等,(当然驱动与应用都改)
应用收到信号,却没有执行signal_handler,而是按照默认的响应死掉了!!!(不管是可靠信号,还是不可靠信号,我试了几个,只有SIGIO是正常的执行signal_handler。)
而且!
而且!
如果我的应用不加fcntl的那3行代码,(这就不能得到fd背后那个驱动发出的信号了)于是,使用kill向这个应用发信号(比如kill -s 35 3340),应用都可以获得信号,并执行signal_handler。
字符驱动里发出的信号,只有SIGIO能在应用里改默认相应动作么???
这是闹哪样啊~~~~~~~~~~
求解啊~~~~~~~~~~~~~~~
我的系统是 Ubuntu 12.04 内核3.13