linux 原生aio API詳解

2021-09-02 22:16:38 字數 2704 閱讀 4991

如下:

extern int io_setup(int maxevents, io_context_t *ctxp);

extern int io_destroy(io_context_t ctx);

extern int io_submit(io_context_t ctx, long nr, struct iocb *ios);

extern int io_cancel(io_context_t ctx, struct iocb *iocb, struct io_event *evt);

extern int io_getevents(io_context_t ctx_id, long min_nr, long nr, struct io_event *events, struct timespec *timeout);

io_setup函式:

此系統呼叫用於建立乙個同步io環境,可以同時處理maxevents個操作,ctxp必須初始化為0,io_setup會自動分配填充空間,所以,呼叫後一定要掉用io_destroy進行釋放掉。

返回值:

成功為0,失敗為以下值

eagain:maxevents已經超過個系統使用者的限制,即檔案/proc/sys/fs/aio-max-nr中的數字

efault:分配給ctxp的指標無效

einval:ctxp未初始化為0或者maxevents超限。

enomem:核心資源不足。(說明系統壓力大)

enosys:未實現此系統呼叫

io_destroy函式:

釋放io_setup建立的非同步io環境,系統呼叫將嘗試取消針對ctx_id的所有未完成的非同步i/o操作,阻塞在不能不取消的操作上直到操作完成。

返回值:

成功為0,失敗為以下值

efault:分配給ctxp的指標無效

einval:分配給ctxp的指標無效

enosys:未實現此系統呼叫

io_submit函式:提交事件

將ios設定的事件,提交到ctx佇列中,等待事件排隊處理。

返回值:

成功:0~nr

eagain:系統內資源不夠用。

ebadf:提交的檔案描述符不對,可能是不支援非同步操作的檔案描述符或者無用已關閉的檔案描述符。

efault:某一部分指標無效

einval:引數有問題,檢查引數設定。

io_cancel函式:

io_cancel()系統呼叫試圖取消以前用io_submit(2)提交的非同步i/o操作。iocb引數描述要取消的操作,ctx引數是提交操作的非同步環境上下文。如果操作被成功取消,則事件將被複製到由結果指向的記憶體中,而不會被放到完成佇列中。

返回值:

成功0,失敗如上

io_getevents函式:

io_getevents系統呼叫讀取ctx非同步環境中至少min_nr至多nr個事件,(前提是timeout為null阻塞到至少符合條件數目的事件,如果設定超時,則在一定的時間後返回)

返回值:成功則為完成的事件,0則表示沒有完成的事件。失敗如上。

完整示例如下:

#include #include #include #include #include #include #include #include #include #define mylog(iret)		fprintf(stderr,"%s %d %s \n",__file__,__line__,strerror(iret))

#define aio_max 64

int filefd1;

int filefd2;

int globle=0;

void wt_func(io_context_t ctx, struct iocb *iocb, long res, long res2 )

void rd_func( io_context_t ctx, struct iocb *iocb, long res, long res2 )

int main()

filefd2 = open("./aio2.txt",o_rdwr,0666);

if ( filefd2 == -1 )

iret = fstat(filefd1,&file1stat);

if ( iret )

aiobufsize = (file1stat.st_size-(file1stat.st_size%4))/4 ;

filesize = file1stat.st_size;

isubmit = 4+1;

int memnum = 0;

for (memnum =0 ;memnumu.c.buf,globle,offset,iocpp[submittemp]->u.c.buf,aiobuf);

offset = offset + aiobufsize;

}eventnum = io_getevents(ctx_idp,1,aio_max,events,null);

if ( eventnum < 0 )

printf("\n得到事件:[%d]\n",eventnum);

for ( ievent=0 ;ieventfor (memnum =0 ;memnumfree(aiobuf);

io_destroy(ctx_idp);

printf("總共呼叫:%d \n",globle);

return 0;

}

原生JS實現ajax詳解

打 分下面4步 1.拿出手機 2.撥號 3.說話 4.聽對方說話 ajax也分下面4步 1.建立ajax物件 2.連線到伺服器 3.傳送請求 告訴伺服器我要什麼檔案 4.接收返回值 下面是原生js寫ajax的具體寫法 但是,不能每次用ajax的時候都寫那麼多 要把這段ajax 封裝起來,方便使用。封...

Ajax原生詳解 學習筆記

ajax支援ie7以上版本,所以在用原生寫ajax的時候需要進行能力測試 var xhr if window.xmlhttprequest else 1 屬性 readystate http請求狀態 當乙個xmlhttprequest初次建立時候,這個屬性的值從0開始,直到接收到完整的http響應,...

原生ajax步驟詳解以及簡單封裝

一原生ajax詳解 二簡單封裝ajax 最後把 封裝起來,封裝起來以後,要給這個函式加上乙個引數url.引數是為了替換要讀取的檔名 function ajax url,fnsucc else ajax.open get url,true 把要讀取的引數的傳過來。ajax.send ajax.onre...