|
};
??
struct aiocb {
?? int aio_fildes; //aio文件描述符
?? int aio_lio_opcode;//进行批量IO操作时有效,读写类型
?? volatile void *aio_buf;//数据缓冲
?? size_t aio_nbytes; //数据缓冲长度
?? int aio_reqprio;//信号优先级
?? struct sigevent aio_sigevent; //aio结束后该执行的操作
?? /* Internal fields */
};
??
struct sigevent {
??union sigev_value{int sival_int;void *sival_ptr;}
??//信号传递值,即信号传递为处理函数的信息;
?? 若函数为独参时为信号值
?? 若为三个参数时则将包含aiocb结构体的siginfo _t传递给函数以完成AIO的异步读写。
??int sigev_signo; //信号值(类型)
??int sigev_notify; //通知模式SIGEV_SIGNAL为信号,SIGEV_THREAD为回调函数
??union {
?? int _pad[SIGEV_PAD_SIZE];
?? int _tid; //使用宏定义sigev_notify_thread_id 线程ID号
?? struct {
?? void (*_function)(sigval_t); //使用宏定义sigev_notify_function为线程回调函数
?? void *_attribute; //使用宏定义sigev_notify_attributes为线程属性
?? } _sigev_thread;
?? } _sigev_un;
};
??
使用范例:
//初始化信号
sig_act.sa_mask=0;
sig_act.sa_flags= SA_SIGINFO; //信号传递aiobc故 //--------------------------------------------------
使用3参数; 无
sig_act. sa_sigaction=fun;//信号处理函数 //---------------------------------------------------
//初始化aiocb结构
my_aiocb. aio_fildes=fd;
my_aiocb. aio_buf=***;
my_aiocb. aio_nbytes=N;
my_aiocb. aio_offset=next_offset;
//表示下一个操作从上一个操作结束处开始
//将AIO请求于与信号处理函数链接 //将AIO请求于与回调线程处理函数链接
my_aiocb. aio_sigevent. sigev_notify=SIGEV_SIGNAL; my_aiocb. aio_sigevent. sigev_notify=SIGEV_THREAD;
//表示以信号作通知 //表示以回调线程作通知
my_aiocb. aio_sigevent. sigev_signo=SIGIO; my_aiocb. aio_sigevent. sigev_notify_function=fun1;//回调函数
my_aiocb. aio_sigevent. sigev_notify_attributes=NULL;//属性不使用
my_aiocb. aio_sigevent. sival_ptr=&my_aiocb; my_aiocb. aio_sigevent. sival_ptr=&my_aiocb;
//捕获信号
sigaction(SIGIO,&sig_act,NULL); //--------------------------------------------------
//信号处理函数 // 回调函数
void fun(int signo,siginfo_t *info,void *context) void fun1(sigval_t sigval)
{-----------------------------p=info->si_value.sival_ptr; {-----------------------------p=sigval.sival_ptr;
//获得aiobc地址 //获得aiobc地址
} ? }