非同步 i/o 是針對同步 i/o 提出的概念,它不需要執行緒等待 i/o 結果,而只需要請求進行傳輸,然後系統會自動完成 i/o 傳輸,結束或者出現錯誤時會產生相應的 i/o 訊號,使用者程式只需要設定好對應的訊號陷入函式,即可處理乙個非同步 i/o 事件。
sigev_notify的取值有以下三種:#include struct aiocb ;
struct sigevent;
sigev_none:非同步i/o請求完成後,不通知程序
sigev_signal:非同步i/o請求完成後,產生由sigev_signo字段指定的訊號。如果應用程式已選擇捕捉訊號,且在建立訊號處理程式的時候指定了sa_siginfo標誌,那麼該訊號將被入隊(如果實現支援排隊訊號),訊號處理程式會傳送給乙個siginfo結構,該結構的si_value欄位被設定為sigev_value
sigev_thread 當非同步i/o請求完成後,由sigev_notify_function指定的函式被呼叫,sigev_value是唯一的引數。除非sigev_notify_attributes欄位被設定為pthread屬性結構的位址,且結構指定了另外的執行緒屬性,否則該函式將在分離狀態下的單獨的執行緒下執行。
#include int aio_read(struct aiocb *aiocbp);
int aio_write(struct aiocb *aiocbp);
int aio_fsync(int op,struct aiocb *aiocbp);
int aio_error(const struct aiocb *aiocbp);
ssize_t aio_return(const struct aiocb *aiocbp);
int aio_suspend(const struct aiocb *list,int nent,const struct timespec* timeout);
int aio_cancel(int op,struct aiocb *aiocbp);
非同步io的操作流程大概如下:
(1)使用aio_read()或者aio_write()將操作請求放入到等待處理的佇列中。這兩個函式的返回值與實際操作結果並沒有任何關係
(2)aio_fsync()函式用於將aio_write()的寫請求同步到硬碟,op指定非同步的方式,若op為o_dsync則表示只是更新硬碟檔案內容,若op為o_sync則表示等待實際i/o結束才返回,從而確保修改過的塊立即寫到硬碟上。
(3)aio_error()是為了獲取到乙個非同步讀寫或同步的狀態,返回值有以下幾種情況:
0:非同步操作完成,可以呼叫aio_return()函式獲取操作返回值
-1:aio_error函式呼叫失敗
einprogress:非同步讀寫或同步仍未完成
(4)如果aio_error()獲取到非同步操作已經完成,則可以使用函式aio_return()獲取非同步操作的返回值,此時必須確保非同步讀寫或同步已經完成,函式呼叫失敗返回-1.
(5)如果在完成了所有事務之後,非同步io仍然沒有完成,可以使用aio_suspend()阻塞程序,直到所有的操作完成,其中list是aio控制塊陣列,nent表明了陣列的個數。aio_suspend()的返回值有三種:(1)如果被訊號中斷,它將返回-1,並將errno設定為eintr.(2)如果timeout超時,它將返回-1,並將errno設定為eagain,timeout為null則表示不限時(3)如果返回值為0,則表示所有非同步io都已經完成,將不阻塞直接返回
(6)當我們不想等待非同步io的操作時,可以使用函式aio_cancel()來嘗試取消他們。fd為操作的檔案描述符,aiocbp為操作的資料塊,如果aiocbp為null,則表示取消fd上面的所有非同步io操作。返回值有以下4種情況:
aio_alldone:所有非同步io操作在嘗試取消他們之前都已經完成
aio_canceled:所有要求的操作已被取消
aio_notcanceled:至少乙個操作請求沒有被取消。
-1:函式呼叫失敗
還有乙個函式,它既可以以同步介面呼叫,也可以以非同步介面呼叫。
#include int aio_listio(int mode,struct aiocb* list,int nent,struct sigevent* sigev);
mode引數決定該函式是非同步還是同步io,如果該引數被設定為lio_wait,則表示該函式是同步的,即在所有操作完成後,函式才返回,此時sigev將被忽略。如果被設定為lio_nowait,函式將是非同步io,即只是將訪問請求放在佇列中即返回,在所有io結束後,按照sigev引數指定的方式被非同步通知,如果不想被通知,可以將sigev設定為null。注意,每個控制塊都有自己在完成後的通知方式,這裡的sigev是另外附加的,它是是所有操作完成後,進行通知。
list是控制塊的列表,nent表示個數。
Unix 環境變數
linux 下處理環境變數常見的幾個操作 env 顯示當前所有的環境變數 set 顯示當前bash下使用者自定義的變數和環境變數 export 把自定義的變數轉換成環境變數 環境表 unix 下的每乙個程式都會有一張環境表,其實我們可以想象,main函式使如下這種形式 int main int ar...
Unix環境變數 執行緒基礎
標頭檔案 include 返回值 若相等則返回非0值,否則返回0值 作用 判斷兩個執行緒id是否相等 pthread t pthread self void 標頭檔案 include 返回值 呼叫執行緒自身的執行緒id intpthread create pthread t tidp,const p...
《unix高階環境程式設計》程序環境 環境變數
環境字串一般表示如下 cpp view plain copy name value 環境變數名,環境變數值 以下根據對環境變數不同的操作得到不同的結果,包括獲取環境變數當前值,新增環境變數,修改環境變數和刪除環境變數 相對應的函式分別為getenv putenv setenv和unsetenv函式,...