您当前的位置:首页 > 国内市场

Linux内核开发之异步通知与异步IO四

2019-01-12 06:30:13

“小王,接着昨天的来,你知道吗?在异步IO中,什么可以用来做为AIO的通知呢?”我用渴求的眼神望着她.

本文引用地址:  "啊?那我咋知道,你说的我能记住就不错了,让我发明创造,我可是不会."小王委屈道。

“笨死了,我前边花了那么多的时间来讲信号之类的东西,联想一下信号作为异步通知的信号,也想的出来啊,告诉你,我当年用脚肢头都能想到,可你..真让我失望”我叹气到,“算了,也不怪你了,咱们开始继续学习吧“。

先上代码:使用信号作为AIO异步IO通知机制

voidsetup_io(..)

{

intfd;

structsigactionsig_act;

structaiocbmy_aiocb;

...

//设置信号处理函数

sigemptyset(&sig__mask);

sig__flags=SA_SIGINFO;

sig__sigaction=aio_completion_handler;

//设置AIO请求

bzero((char*)&my_aiocb,sizeof(structaiocb));

my_o_flags=fd;

my_o_buf=malloc(BUF_SIZE+1);

my_o_nbytes=BUF_SIZE;

my_fset=next_offset;

//连接AIO请求和信号处理函数

my_o_gev_notify=SIGEV_SIGNVAL;

my_o_gev_signo=SIGIO;

my_c_gev_val_ptr=&my_aiocb;

//将信号和处理函数绑定

ret=sigaction(SIGION,&sig_act,NULL);

...

ret=aio_read(&my_aiocb);

//信号处理函数

voidaio_completion_handler(intsigno,siginfo_t*info,void*context)

{

structaiocb*req;

//确定是我们需要的信号

if(info->si_signo==SIGIO)

{

req=(structaiocb*)info->si_val_ptr;//获得aiocb;

//请求的操作是否完成

if(aio_error(req)==0)

{

ret=aio_return(req);

}

}

return;

}

从上边可以看到,使用AIO的应用程序同样需要定义信号处理函数,在指定的信号被产生时会触发调用这个处理程序。

“那么是不是就只能使用信号这种方式呢,我记得以前没一个知识点你都给我讲了好多方法,这个歌也不例外吧”小王说。

“嗯,真聪明,就喜欢聪明的女生”听到小王也懂得开动脑子了,我也要表示表示不是。

再上代码:使用回调函数最为AIO的通知

voidsetup_io(..)

{

...//同上

//连接AIO请求和线程回调函数

my_o_gev_notify=SIGEV_THREAD;

my_o_tify_function=aio_completion_handler;

//设置回调函数

my_o_tify_attributes=NULL;

my_o_gev_val_ptr=&my_aiocb;

...

ret=aio_read(&my_aiocb);

//信号处理函数

voidaio_completion_handler(intsigno,siginfo_t*info,void*context)

{

structaiocb*req;

req=(structaiocb*)val_ptr;//获得aiocb;

//请求的操作是否完成

if(aio_error(req)==0)

{

ret=aio_return(req);

}

return;

}

上述程序在创建aiocb请求之后,使用SIGEV_THREAD请求了一个线程回调函数作为通知方法。在回调函数中。通过(structaiocb*)info->si_val_ptr可以获得对应的aiocb指针,使用AIO函数可验证请求是否已经完成。

“不过,小王,对不起哈,没想到一说就收不住了,这节也只是讲了有关的应用,下节咱们开始讲讲AIO与驱动设备,回归驱动主题”。

订做西装

低温槽

HV-5维氏硬度计

数显压力试验机

推荐阅读
图文聚焦