编程接口指南

Solaris 异步 I/O

本节介绍 Solaris 操作环境中的异步 I/O 操作。

通知 (SIGIO)

如果异步 I/O 调用成功返回,则表明 I/O 操作只是已排队并等待执行。实际操作包含一个返回值和一个潜在错误标识符。如果同步进行调用,则该返回值和潜在错误标识符会返回到调用方。完成 I/O 之后,会将返回值和错误值存储于用户在请求作为指向 aio_result_t 的指针时提供的位置。aio_result_t 的结构在 <sys/asynch.h> 中定义:

typedef struct aio_result_t {

 	ssize_t	aio_return; /* return value of read or write */

 	int 		aio_errno;  /* errno generated by the IO */

 } aio_result_t;

更新 aio_result_t 之后,便会将 SIGIO 信号传送到发出 I/O 请求的进程。

请注意,包含两个或多个暂挂的异步 I/O 操作的进程没有特定方法可确定 SIGIO 信号的成因。接收 SIGIO 的进程应该检查其所有可能会生成 SIGIO 信号的条件。

使用 aioread

aioread(3AIO) 例程是 read(2) 的异步版本。除了常规读取参数之外,aioread(3AIO) 还会采用可指定文件位置和 aio_result_t 结构地址的参数。有关操作的结果信息存储在 aio_result_t 结构中。文件位置指定操作之前要在文件内执行查找操作。无论 aioread(3AIO) 调用成功还是失败,都会更新文件指针。

使用 aiowrite

aiowrite(3AIO) 例程是 write(2) 的异步版本。除了常规写入参数之外,aiowrite(3AIO) 还会采用可指定文件位置和 aio_result_t 结构地址的参数。有关操作的结果信息存储在 aio_result_t 结构中。

文件位置指定操作之前要在文件内执行查找操作。如果 aiowrite(3AIO) 调用成功,则会将文件指针更新为指向可实现成功查找和写入的位置。如果写操作不再考虑后续的写入请求,则还会更新文件指针。

使用 aiocancel

aiocancel(3AIO) 例程可用于尝试取消 aio_result_t 结构指定作为参数的异步请求。仅当请求仍进行排队时,aiocancel(3AIO) 调用才会成功。如果操作正在进行中,则 aiocancel(3AIO) 会失败。

使用 aiowait

调用 aiowait(3AIO) 会阻塞调用过程,直到至少有一个未完成的异步 I/O 操作完成为止。超时参数是指等待 I/O 完成的最大时间间隔。超时值为 0 指明不需要等待。aiowait(3AIO) 会针对已完成的操作返回指向 aio_result_t 结构的指针。

使用 poll()

要以同步方式(而不是依赖于 SIGIO 中断)确定异步 I/O 事件是否完成,请使用 poll(2)。另外,还可以进行轮询来确定 SIGIO 中断的原因。

poll(2) 用于大量文件时会比较缓慢。此问题可通过 poll(7d) 进行解决。

使用 poll 驱动程序

使用 /dev/poll 可提供具有高度可伸缩性的轮询大量文件描述符的方法。这种可伸缩性是通过一组新的 API 和一个新驱动程序 /dev/poll 实现的。/dev/poll API 是 poll(2) 的备用项,而不是替换项。可以使用 poll(7d) 提供 /dev/poll API 的详细信息和示例。 如果正确使用,/dev/poll API 的扩展性将优于 poll(2)。此 API 尤其适用于满足以下条件的应用程序:

使用 close

文件通过调用 close(2) 来关闭。调用 close(2) 会取消任何可以关闭的未完成异步 I/O 请求。close(2) 将等待无法取消的操作。有关更多信息,请参见使用 aiocancelclose(2) 返回时,没有任何异步 I/O 针对文件描述符暂挂。文件关闭时,只取消排队到指定文件描述符的异步 I/O 请求,而不会取消针对其他文件描述符的任何 I/O 暂挂请求。