蓝天

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 */


posted on 2014-04-14 09:02  #蓝天  阅读(251)  评论(0编辑  收藏  举报

导航