1、自定义信号处理函数,参数为所接收的信号值
2、绑定信号与信号处理函数
3、有的设备文件须如下设置方能发送信号(如输入流文件STDIN_FILENO)
设置文件拥有者为本进程
设置文件支持FASYNC异步通知模式
有的设备不需要(如键盘)
二、驱动程序——信号的发送
1、当文件属性改为FASYNC异步通知模式时,就会调用驱动程序中的fasync()操作来将设备文件添加到异步通知列表中(该操作中的fasync_helper()就是处理FASYNC标志变更的),即生成一个fasync_struct结构体并插入异步通知列表中,然后将异步结构体指针指向它
2、驱动程序通过kill_fasync释放信号给应用程序,实现异步通知
3、可通过globalfifo_fasync(-1,filp,0)把异步通知结构体从异步通知列表中删除
三、AIO系列API
1、intaio_read(struct aiocb *)请求一个异步读操作
2、intaio_write(struct aiocb *)请求一个异步写操作
3、intaio_error(struct aiocb *)确定请求状态
4、ssize_taio_return(struct aiocb *)获取传输的字节数
5、intaio_suspend(const struct aiocb *,int,const struct timespec*)挂起(或阻塞)调用进程
6、intaio_cancel(int,struct aiocb *)取消某个请求
7、intlio_listio(int,struct aiocb *,int,struct sigevent *)一次启用大量I/O操作
structaiocb{
aio_buf;
aio_fildes;
aio_nbytes;
aio_offset;
}
一个这样的结构体代表着一个I/O操作请求
四、异步通知——驱动程序
异步I/O——应用程序
1、使用信号作为AIO的通知
2、使用回调函数作为AIO的通知
五、1、在用户空间验证globalfifo的异步通知
2、使用信号作为AIO的通知
(1)设置AIO请求
(2)设置sig_act(signal和处理函数)
(3)链接AIO请求和signal
3、使用回调函数作为AIO的通知
(1)设置AIO请求
(2)链接AIO请求和回调函数
六、1、/proc/sys/fs/aio-nr
异步IO请求现有数目
2、/proc/sys/fs/aio-max-nr
异步IO请求最大数目
七、1、在内核中,每一个I/O请求都有对应的一个kiobc结构体
2、字符设备驱动程序中,file_operation包含3个与AIO有关的成员函数
*aio_read() *aio_write() *aio_fasync()
3、应用程序中的aio_read()和aio_write()函数本身不一定完成了读写操作,只是发起初始化读和写操作
八、设备驱动中的异步I/O函数