Linux内核开发之异步通知与异步I/O(四)
来源:互联网 发布:软文标题 知乎 编辑:程序博客网 时间:2024/06/08 17:09
“小王,接着昨天的来,你知道吗?在异步IO中,什么可以用来做为AIO的通知呢?”我用渴求的眼神望着她.
"啊?那我咋知道,你说的我能记住就不错了,让我发明创造,我可是不会."小王委屈道。
“笨死了,我前边花了那么多的时间来讲信号之类的东西,联想一下信号作为异步通知的信号,也想的出来啊,告诉你,我当年用脚肢头都能想到,可你..真让我失望”我叹气到,“算了,也不怪你了,咱们开始继续学习吧“。
先上代码:使用信号作为AIO异步IO通知机制
void setup_io(..){ int fd; struct sigaction sig_act; struct aiocb my_aiocb; ... //设置信号处理函数 sigemptyset(&sig_act.sa_mask); sig_act.sa_flags = SA_SIGINFO; sig_act.sa_sigaction = aio_completion_handler; //设置AIO请求 bzero((char *)&my_aiocb, sizeof(struct aiocb)); my_aiocb.aio_flags = fd; my_aiocb.aio_buf = malloc(BUF_SIZE + 1); my_aiocb.aio_nbytes = BUF_SIZE; my_aiocb.offset = next_offset; //连接AIO请求和信号处理函数 my_aiocb.aio_sigevent.sigev_notify = SIGEV_SIGNVAL; my_aiocb.aio_sigevent.sigev_signo = SIGIO; my_aiocb.aic_sigevent.sigev_value.sival_ptr = &my_aiocb; //将信号和处理函数绑定 ret = sigaction(SIGION, &sig_act, NULL); ... ret = aio_read(&my_aiocb);} //信号处理函数void aio_completion_handler(int signo, siginfo_t *info, void *context){ struct aiocb *req; //确定是我们需要的信号 if(info->si_signo == SIGIO) { req = (struct aiocb *)info->si_value.sival_ptr; //获得aiocb; //请求的操作是否完成 if(aio_error(req) ==0 ) { ret = aio_return(req); } } return ;}
“那么是不是就只能使用信号这种方式呢,我记得以前没一个知识点你都给我讲了好多方法,这个歌也不例外吧”小王说。
“嗯,真聪明,就喜欢聪明的女生”听到小王也懂得开动脑子了,我也要表示表示不是。
再上代码:使用回调函数最为AIO的通知
void setup_io(..){ ...//同上 //连接AIO请求和线程回调函数 my_aiocb.aio_sigevent.sigev_notify = SIGEV_THREAD; my_aiocb.aio_sigevent.notify_function = aio_completion_handler; //设置回调函数 my_aiocb.aio_sigevent.notify_attributes = NULL; my_aiocb.aio_sigevent.sigev_value.sival_ptr = &my_aiocb; ... ret = aio_read(&my_aiocb);} //信号处理函数void aio_completion_handler(int signo, siginfo_t *info, void *context){ struct aiocb *req; req = (struct aiocb *)sigval.sival_ptr; //获得aiocb; //请求的操作是否完成 if(aio_error(req) ==0 ) { ret = aio_return(req); } return ;}
上述程序在创建aiocb请求之后,使用SIGEV_THREAD请求了一个线程回调函数作为通知方法。在回调函数中。通过(struct aiocb *)info->si_value.sival_ptr可以获得对应的aiocb指针,使用AIO函数可验证请求是否已经完成。
“不过,小王,对不起哈,没想到一说就收不住了,这节也只是讲了有关的应用,下节咱们开始讲讲AIO与驱动设备,回归驱动主题”。
0 0
- Linux内核开发之异步通知与异步I/O(四)
- Linux内核开发之异步通知与异步I/O(四)
- Linux内核开发之异步通知与异步I/O《来自linux设备开发详解》
- Linux内核开发之异步通知与异步I/O(一)
- Linux内核开发之异步通知与异步I/O(二)
- Linux内核开发之异步通知与异步I/O(三)
- Linux内核开发之异步通知与异步I/O(五)
- Linux内核开发之异步通知与异步I/O(一)
- Linux内核开发之异步通知与异步I/O(二)
- Linux内核开发之异步通知与异步I/O(三)
- Linux内核开发之异步通知与异步I/O(五)
- Linux内核开发之异步通知与异步I/O(一)
- Linux内核开发之异步通知与异步I/O_fcntl
- linux设备驱动之异步通知与异步I/O
- Linux设备驱动之阻塞I/O与异步通知
- Linux设备驱动中的异步通知与异步I/O
- linux异步通知与异步I/O笔记
- Linux设备驱动中的异步通知与异步I/O
- [Oracle] enq: TX - row lock contention 优化案例
- 黑马程序员-File类文件操作
- Linux内核开发之异步通知与异步I/O(三)
- 实践敏捷估算(1)——不仅仅是估不准的问题
- 线性表中插入元素的实现,有兴趣可以看一下
- Linux内核开发之异步通知与异步I/O(四)
- Linux内核开发之异步通知与异步I/O(五)
- Cocos2d-x:整体框架源码分析以及启动过程原理(win32)
- Java集合框架官方教程(5):集合类的同步包装器/不可变包装器
- 编程问题
- QSignalMapper类处理多信号关联同一个槽的方法(1)
- JAVA实现双向链表
- Linux内核开发之中断与时钟(一)
- 公司首席设计师推荐的视觉体验设计站点很不错