“小王,接着昨日的来,你知道吗?在异步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的使用程序相同需求界说信号处理函数,在指定的信号被发生时会触发调用这个处理程序。
“那么是不是就只能运用信号这种办法呢,我记住曾经没一个知识点你都给我讲了很多办法,这个歌也不破例吧”小王说。
“嗯,真聪明,就喜爱聪明的女生”听到小王也懂得开动脑子了,我也要表明表明不是。
再上代码:运用回调函数最为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与驱动设备,回归驱动主题”。