Orace开源的异步IO编程库,特点是接口非常简单
官网:https://oss.oracle.com/projects/libaio-oracle/,正如标题所说,非常简单了,不用多解释,请直接看头文件,其中aio_poll类似于poll,重要的结构是aiocb64,类似于epoll_event。
#ifndef _SKGAIO_H
#define _SKGAIO_H
#define IOCB_CMD_READ 0
#define IOCB_CMD_WRITE 1
#define IOCB_CMD_NOP 2
#define IOCB_CMD_CANCEL 3
#define IOCB_CMD_FSYNC 4
#define IOCB_CMD_FDSYNC 5
#define IOCB_CMD_RUNNING 6
#define IOCB_CMD_DONE 7
/* Maximum number of events to retrieve at once */
#define MAX_EVENTS 512
#define MAX_AIO_REAP MAX_EVENTS
#include <stdlib.h>
#include <asm/unistd.h>
#include <linux/types.h>
#include <signal.h>
/*
* we always use a 64bit off_t when communicating
* with userland. its up to libraries to do the
* proper padding and aio_error abstraction
*
* FIXME: this must change from glibc's definition
* as we do *not* use the sigevent structure which
* is big and bloated.
*/
struct aiocb64 {
int aio_fildes; /* File desriptor. */
short aio_lio_opcode; /* Operation to be performed. */
short aio_reqprio; /* Request priority offset. */
void *aio_buf; /* Location of buffer. */
size_t aio_nbytes; /* Length of transfer. */
loff_t aio_offset; /* File offset. */
/* these are internal to the kernel/libc. */
long __aio_key; // kernel sets this to -1 if completed
// otherwise >= 0 (the request#)
void * __aio_data; // pointer to be returned in event's data
int __error_code;
};
#ifdef DEBUG
#define dbg_printf(fmt,arg...)\
printf(fmt, ##arg)
#else
#define dbg_printf(fmt,arg...)\
do { } while(0);
#endif
#define aiocb aiocb64
#define aio_read aio_read64
#define aio_write aio_write64
#define aio_poll aio_poll64
#define aio_error aio_error64
#define aio_return aio_return64
#define aio_cancel aio_cancel64
#define aio_suspend aio_suspend64
#define lio_listio lio_listio64
#define aio_reap aio_reap64
/* Initialize async i/o with the given maximum number of requests */
int aio_init(int max_requests);
/* Enqueue read request for given number of bytes and the given priority. */
int aio_read64(struct aiocb64 *aiocbp);
/* Enqueue write request for given number of bytes and the given priority. */
int aio_write64(struct aiocb64 *aiocbp);
/* Enqueue a poll request for a given fd. */
int aio_poll64(struct aiocb64 *aiocbp);
/*
* Returns the status of the aiocb.
* If the operation is incomplete, the return value is undefined
* < -1 is -errno for the call.
* >= -1 is the return code of the completed operation
*/
ssize_t aio_return64(struct aiocb64 *aiocbp);
/*
* Returns the error status of the aiocb.
* < 0 is -errno for the call.
* 0 is successfully complete
* EINPROGRESS is not complete at all.
* > 0 is errno for unsuccessful completion.
*/
int aio_error64(struct aiocb64 *aiocbp);
/*
* Try to cancel asynchronous I/O requests outstanding against file
* descriptor FILDES.
*/
int aio_cancel64 ( int fildes, struct aiocb64 *aiocbp);
/*
* Suspend calling thread until at least one of the asynchronous I/O
* operations referenced by LIST has completed.
*/
int aio_suspend64(const struct aiocb64 * const list[],int nent,
const struct timespec *timeout);
/*
* Suspend calling thread until waitfor asynchronouse I/O operations
* outstanding have completed.
*/
int aio_reap64(struct timespec *timeout, int waitfor,
struct aiocb *out_list[], int listsize,
int *completed_count);
int lio_listio64(int mode, struct aiocb64 * const list[], int nent,
struct sigevent *__restrict __sig);
/* Operation codes for `aio_lio_opcode'. */
enum
{
LIO_READ,
#define LIO_READ LIO_READ
LIO_WRITE,
#define LIO_WRITE LIO_WRITE
LIO_NOP,
#define LIO_NOP LIO_NOP
LIO_POLL,
#define LIO_POLL LIO_POLL
};
/* Return values of cancelation function. */
enum
{
AIO_CANCELED,
#define AIO_CANCELED AIO_CANCELED
AIO_NOTCANCELED,
#define AIO_NOTCANCELED AIO_NOTCANCELED
AIO_ALLDONE
#define AIO_ALLDONE AIO_ALLDONE
};
/* Synchronization options for `lio_listio' function. */
enum
{
LIO_WAIT,
#define LIO_WAIT LIO_WAIT
LIO_NOWAIT
#define LIO_NOWAIT LIO_NOWAIT
};
#endif /* _SKGAIO_H */
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义