Linux字符设备驱动 异步通知
加了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
相关推荐
linux内核驱动详解1
买书时赠送的电子稿,代码示例丰富,非常不错!全书分三个文件打包。 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools-3.2.2.tar.bz2 | `-- modutils-2.4.5-1.src.rpm |-- 04 | |-- 内核模块参数范例 | | `-- book.c | |-- 内核模块导出符号 | | `-- export_symb.c | `-- 最简单的内核模块 | `-- hello.c |-- 05 | `-- udev源代码 | `-- udev-114.tar.gz |-- 06 | |-- globalmem驱动 | | `-- globalmem.c | `-- 包含2个globalmem设备的驱动 | `-- globalmem_two.c |-- 07 | `-- 含并发控制的globalmem驱动 | `-- globalmem_lock.c |-- 08 | |-- globalfifo驱动 | | `-- globalfifo.c | `-- poll应用程序范例 | `-- pollmonitor.c |-- 09 | |-- 异步通知应用程序范例 | | `-- asyncmonitor.c | `-- 支持异步通知的globalfifo | `-- globalfifo_async.c |-- 10 | |-- S3C2410实时钟驱动 | | `-- s3c2410-rtc.c | `-- 秒设备驱动与应用程序 | |-- second.c | `-- second_test.c |-- 11 | |-- DMA范例 | | |-- 3c505.c | | |-- 3c505.h | | `-- dma.h | `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | | `-- s3c2410-ts.c | |-- 看门狗驱动 | | `-- s3c2410_wdt.c | `-- 平台设备 | `-- devs.c |-- 13 | |-- IDE驱动 | | |-- ide-disk.c | | `-- ide-h8300.c | `-- RAMDISK驱动 | `-- rd.c |-- 14 | |-- S3C2410串口驱动 | | |-- regs-gpio.h | | |-- regs-serial.h | | `-- s3c2410.c | `-- 串口核心层 | |-- serial_core.c | `-- serial_core.h |-- 15 | |-- S3C2410 I2C主机驱动 | | |-- i2c-s3c2410.c | | |-- iic.h | | |-- regs-gpio.h | | `-- regs-iic.h | `-- SAA711x I2C设备驱动 | `-- saa711x.c |-- 16 | `-- CS8900以太网设备驱动 | |-- cs89x0.c | `-- cs89x0.h |-- 17 | |-- ALSA工具及库 | | |-- alsa-driver-1.0.15.tar.bz2 | | |-- alsa-firmware-1.0.15.tar.bz2 | | |-- alsa-lib-1.0.15.tar.bz2 | | |--
基于Linux的处理器间SPI总线通信的优化实现.pdf
基于Linux的处理器间SPI总线通信的优化实现.pdf
初级字符驱动流程
高手请绕道,初学者可以参考下,理理流程和思路,有一定参考价值。
深入浅出Linux 设备驱动编程
深入浅出Linux 设备驱动编程,值得学习一下
深入浅出Linux设备驱动编程
包括定时器、异步通知、中断处理、内存与IO操作、阻塞与非阻塞、并发控制、字符设备驱动程序、复杂设备驱动、结构化设备驱动程序这⑨个部分



