4. int aio_error(const struct aiocb *aiocbp);
如果該函數返回0,表示aiocbp指定的異步I/O操作請求完成。
如果該函數返回EINPROGRESS,表示aiocbp指定的異步I/O操作請求正在處理中。
如果該函數返回ECANCELED,表示aiocbp指定的異步I/O操作請求已經取消。
如果該函數返回-1,表示發生錯誤,檢查errno。
5. ssize_t aio_return(struct aiocb *aiocbp);
這個函數的返回值相當於同步I/O中,read/write的返回值。只有在aio_error調用後
才能被調用。
6. int aio_cancel(int fd, struct aiocb *aiocbp);
取消在文件描述符fd上的aiocbp所指定的異步I/O請求。
如果該函數返回AIO_CANCELED,表示操作成功。
如果該函數返回AIO_NOTCANCELED,表示取消操作不成功,使用aio_error檢查一下狀態。
如果返回-1,表示發生錯誤,檢查errno.
7. int lio_listio(int mode, struct aiocb *restrict const list[restrict],
int nent, struct sigevent *restrict sig);
使用該函數,在很大程度上可以提高系統的性能,因為再一次I/O過程中,OS需要進行
用戶態和內核態的切換,如果我們將更多的I/O操作都放在一次用戶太和內核太的切換中,
減少切換次數,換句話說在內核盡量做更多的事情。這樣可以提高系統的性能。
用戶程序提供一個struct aiocb的數組,每個元素表示一次AIO的請求操作。需要設置struct aiocb
中的aio_lio_opcode數據成員的值,有LIO_READ,LIO_WRITE和LIO_NOP。
nent表示數組中元素的個數。最後一個參數是對AIO操作完成後的通知機制的設置。
8. 設置AIO的通知機制,有兩種通知機制:信號和回調
(1).信號機制
首先我們應該捕獲SIGIO信號,對其作處理:
struct sigaction sig_act;
sigempty(&sig_act.sa_mask);
sig_act.sa_flags = SA_SIGINFO;
sig_act.sa_sigaction = aio_handler;
struct aiocb myaiocb;
bzero( (char *)&myaiocb, sizeof(struct aiocb) );
myaiocb.aio_fildes = fd;
myaiocb.aio_buf = malloc(BUF_SIZE+1);
myaiocb.aio_nbytes = BUF_SIZE;
myaiocb.aio_offset = next_offset;
myaiocb.aio_sigevent.sigev_notify = SIGEV_SIGNAL;
myaiocb.aio_sigevent.sigev_signo = SIGIO;
myaiocb.aio_sigevent.sigev_value.sival_ptr = &myaiocb;
ret = sigaction( SIGIO, &sig_act, NULL );
信號處理函數的實現:
void aio_handler( int signo, siginfo_t *info, void *context )
{
struct aiocb *req;
if (info->si_signo == SIGIO) {
req = (struct aiocb *)info->si_value.sival_ptr;
if (aio_error( req ) == 0) {
ret = aio_return( req );
}
}
return;
}
(2). 回調機制
需要設置:
myaiocb.aio_sigevent.sigev_notify = SIGEV_THREAD
my_aiocb.aio_sigevent.notify_function = aio_handler;
回調函數的原型:
typedef void (* FUNC_CALLBACK)(sigval_t sigval);
AIO機制為服務器端高並發應用程序提供了一種性能優化的手段。加大了系統吞吐量。