當前位置:編程學習大全網 - 源碼下載 - 如何判斷Solaris上是否支持異步IO

如何判斷Solaris上是否支持異步IO

在Solaris Internals這本書上,作者提到壹段代碼用以檢測系統是否支持異步I/O.

感覺很有助於理解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

  • 上一篇:線段中心源代碼
  • 下一篇:如何寫cmake使其包含c++11特性
  • copyright 2024編程學習大全網