感覺很有助於理解Solaris系統異步IO的實現以及系統調用。
列在這裏和大家分享.
1.源碼:
/*
* Quick kaio test. Read 1k bytes from a file using async I/O.
* To compile:
* cc -o aio aio.c -laio
* To run:
* aio file_name
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/fcntl.h>
#include <sys/aio.h>
#define BSIZE 1024
main(int argc, char *argv[])
{
aio_result_t res;
char buf[BSIZE];
int fd;
if ((fd=open(argv[1], O_RDONLY)) == -1) {
perror("open");
exit(-1);
}
aioread(fd, buf, BSIZE, 0L, SEEK_SET, &res);
aiowait(0);
if (res.aio_return == BSIZE) {
printf("aio succeeded\n");
close(fd);
exit(0);
}
perror("aio");
}
2.編譯:
# cc -o aio aio.c -laio
3.運行:
首先測試裸設備:
# truss -t kaio,lwp_create ./aio /dev/rdsk/c0t0d0s1
kaio(5, 0xFFBEF640, 0x00000000, 0xFF21FB68, 0x00000000, 0xFFBEF648, 0x00000000) = 0
lwp_create(0xFFBEF640, 0, 0xFF21FF5C) = 2
lwp_create() (returning as new lwp ...) = 0
kaio(AIOREAD, 3, 0xFFBEF9C0, 1024, 0, 0xFFBEFDC0) = 0
kaio(AIOWAIT, 0x00000000) = 4290706880
aio succeeded
我們看到,Solaris對於裸設備,最終異步IO調用通過AIOREAD來實現,異步操作成功。
而對於常規文件系統文件的讀取:
# truss -t kaio,lwp_create ./aio /a.sh
kaio(5, 0xFFBEF650, 0x00000000, 0xFF21FB68, 0x00000000, 0xFFBEF658, 0x00000000) = 0
lwp_create(0xFFBEF650, 0, 0xFF21FF5C) = 2
lwp_create() (returning as new lwp ...) = 0
kaio(AIOREAD, 3, 0xFFBEF9D0, 1024, 0, 0xFFBEFDD0) Err#48 ENOTSUP
lwp_create(0xFFBEF5F0, 0, 0xFF20DF5C) = 3
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1FBF5C) = 4
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1E9F5C) = 5
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1D7F5C) = 6
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1C5F5C) = 7
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1B3F5C) = 8
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF1A1F5C) = 9
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF18FF5C) = 10
lwp_create() (returning as new lwp ...) = 0
lwp_create(0xFFBEF5F0, 0, 0xFF17DF5C) = 11
lwp_create() (returning as new lwp ...) = 0
kaio(AIOWAIT, 0x00000000) = 1
kaio(AIONOTIFY, -13008896) = 0
aio succeeded
我們註意到,首先對於AIOREAD系統給出了壹個Err#48錯誤,表明對於文件系統的異步IO不被支持。
最後操作成功,實際上是系統把異步IO調用轉化為pread讀取。
在完整的truss輸出中妳可以看到如下壹行:
pread64(3, "7F E L F010201\0\0\0\0\0".., 1024, 0) = 1024
而成功的異步IO是通過如下壹行來完成讀取的:
kaio(AIOREAD, 3, 0xFFBEF9C0, 1024, 0, 0xFFBEFDC0) = 0