应用层获得SIGIO信号如何区分是kill_fasync(poll_in)或kill_fasync(poll_out)产生的

langlixiaobaitiao 2011-07-07 11:52:57
static ssize_t xxx_write(...)
{
...
echo "....">设备 完成写操作时发送信号
if(dev->async_queue)
kill_fasync(&dev->async_queue,SIGIO,POLL_IN);
}
static ssize_t xxx_read(...)
{
...
完成读设备操作时发送信号
if(dev->async_queue)
kill_fasync(&dev->async_queue,SIGIO,POLL_OUT);
}
以上是驱动中的读写两个函数,在应用程序中都会获得SIGIO信号
signal(SIGIO,xxx);xxx为处理函数
我的问题是,如何在应用程序中区分到底是读完成后产生的SIGIO信号,还是写完成后产生的
求高手教下怎么在接受信号后把读写分开
例如,写完成后产生SIGIO信号,进入处理函数,经过什么判断知道是写完成,我们就进行读操作
反之一样
...全文
844 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
hard_man 2012-08-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
我觉得可以在驱动中设置一个布尔变量,表示是通知读还是写,再写一个比如ioctl函数来允许用户程序访问该变量。然后用户程序的信号处理函数在收到SIGIO时,通过ioctl检查该变量就可以知道是该读还是写了。当然这个变量可能在通知时又被新发生的读或写修改,这需要进行一些同步处理。
可以参照驱动和硬件之间的中断处理,在中断的上半部处理中,如果是共享中断号的设备,在发生中断时中断处理函数是无法通过传递来……
[/Quote]

如果是这样,那么kill_fasync()的第三个参数,传什么就不重要了吧。但是为什么很多资料中都说,如果可写,必须设为POLLOUT,可读,必须设为POLLIN。。是否有方法在应用中获得这个参数呢?
谢谢!
星期四 2011-09-10
  • 打赏
  • 举报
回复 1
函数kill_fasync中参数POLL_IN表示可读,POLL_OUT表示可写。
operands 2011-07-29
  • 打赏
  • 举报
回复
我觉得可以在驱动中设置一个布尔变量,表示是通知读还是写,再写一个比如ioctl函数来允许用户程序访问该变量。然后用户程序的信号处理函数在收到SIGIO时,通过ioctl检查该变量就可以知道是该读还是写了。当然这个变量可能在通知时又被新发生的读或写修改,这需要进行一些同步处理。
可以参照驱动和硬件之间的中断处理,在中断的上半部处理中,如果是共享中断号的设备,在发生中断时中断处理函数是无法通过传递来的参数识别出是哪个设备发生的中断,只知道是这几个设备中至少有一个发生了。识别方法就是,在中断处理函数中依次遍历这些设备,一般设备都会有一些状态寄存器标志是否有数据到来,是否发生中断等信息,访问这些寄存器就可以知道是否是这个设备发出的中断,这样查找直到发现某个设备发生中断。共享中断号就是把这么多的设备的中断进行分组,以便在中断发生时可以缩小查找范围,所有设备用一个中断线应该也可以,但每次都要全部遍历,代价很大。
在LZ的这个问题中,应用程序相当于驱动,驱动中的读和写就相当于两个共享中断号的硬件,异步通知相当于中断,布尔变量就相当于状态寄存器,类比一下就好理解了。
li_xiang1102 2011-07-15
  • 打赏
  • 举报
回复
我也想知道呢 最近在考虑这个问题
feidouqwer 2011-07-13
  • 打赏
  • 举报
回复
可否采用select函数进行查询啊
T___Rr 2011-07-13
  • 打赏
  • 举报
回复
同样等高手

18,773

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 专题技术讨论区
社区管理员
  • 专题技术讨论区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧