双11狂欢大促

盲盒赢 定制羽绒服

开启惊喜盲盒,抽取你的专属好礼

— 惊喜奖品抢先看 —

Linux字符设备驱动 异步通知

枫叶雪 枫叶雪 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
发现一个不理解的问题啊~
加了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 | | |--

山不转水转_Geek

基于Linux的处理器间SPI总线通信的优化实现.pdf

基于Linux的处理器间SPI总线通信的优化实现.pdf

结冰架构

初级字符驱动流程

高手请绕道,初学者可以参考下,理理流程和思路,有一定参考价值。

NUC-94210

深入浅出Linux 设备驱动编程

深入浅出Linux 设备驱动编程,值得学习一下

EtherXiaoXin

深入浅出Linux设备驱动编程

包括定时器、异步通知、中断处理、内存与IO操作、阻塞与非阻塞、并发控制、字符设备驱动程序、复杂设备驱动、结构化设备驱动程序这⑨个部分

「已注销」
评论 10
收藏 已收藏
分享
返回顶部
枫叶雪
Linux/Unix社区 23,224 成员 74,535 内容