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,但我在實際應用中沒有找到他的定義。