zoukankan      html  css  js  c++  java
  • 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 */
    


  • 相关阅读:
    Android开发 default activity not found
    git仓库的初始化
    微服务学习----分布式锁
    Spring boot 学习 ---- Spring Security
    虚拟容器化学习----Docker学习
    Java学习----JVM学习
    spring boot学习 ---- spring boot 之注解(持续更新)
    其他技术----protobuf
    Spring Boot 学习 ---- 监听器
    Spring Boot学习----拦截器
  • 原文地址:https://www.cnblogs.com/aquester/p/9891634.html
Copyright © 2011-2022 走看看