aio是linux上的异步IO实现,具体测试代码如下:
aiocb ab;
bzero( (char *)&ab, sizeof(struct aiocb) );
int fd = open("a.txt", O_RDWR | O_APPEND);
ab.aio_buf = malloc(201);
ab.aio_fildes = fd;
ab.aio_nbytes = 20;
ab.aio_offset = 0;
int r = aio_read(&ab);
std::cout << "return:" << r << std::endl;
std::cout << "buff:" << (char *)ab.aio_buf << std::endl;
r = aio_return(&ab);
std::cout << "return:" << r << std::endl;
char *b = "good boy!!";
ab.aio_buf = b;
aio_write(&ab);
关键点在于,struct aiocb结构体的填充。
aio通知机制:
信号
ab.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
ab.aio_sigevent.sigev_signo = SIGIO;
ab.aio_sigevent.sigev_value.sival_ptr = &ab;
线程
acb.aio_sigevent.sigev_notify = SIGEV_THREAD;
acb.aio_sigevent._sigev_un._sigev_thread._function = rw;
acb.aio_sigevent._sigev_un._sigev_thread._attribute = NULL;
acb.aio_sigevent.sigev_value.sival_ptr = &acb;
可能因为不同版本的头文件提供的接口有所不同,网上有些资料说的是acb.aio_sigevent.notify_function,但我在实际应用中没有找到他的定义。