2 POSIX 非同步IO 非同步操作狀態

2021-08-26 20:16:01 字數 1436 閱讀 7651

當你使用 aio_read 或 aio_write 等函式發起了非同步讀或寫時,核心就自己去幹活了,假設你目前還不知道非同步通知的方法,你就只能不斷的詢問核心:「你讀完沒?」,正如同前面的那段程式:

// 不斷的檢查非同步讀的狀態,如果返回 einprogress,說明非同步讀還沒完成

// 輪詢檢查狀態是一種很笨的方式,其實可以讓作業系統用訊號的方式來通知,或者讓作業系統完成讀後主動建立乙個執行緒執行。在後面我們會繼續學習這兩種通知方式。

while(aio_error(&my_aiocb) == einprogress)

error 這個名字很容易讓人產生誤解,實際上,它只是為了獲取非同步請求的狀態。比如有沒有讀完?aio_error 的函式原型如下:

int aio_error(const struct aiocb *aiocb);
返回值有以下幾種情況:

aio_error 是執行緒安全的。

關於 aio_error 的實驗,在前面的程式中已經演示過啦,就不重複了。這裡還有乙個新的函式叫 aio_return,也是獲取非同步操作的狀態……

函式原型如下:

// ssize_t 你就理解成 int 型別吧

ssize_t aio_return(struct aiocb *aiocbp);

該函式返回最終的非同步請求狀態。

注意:這個函式對於每個請求只能使用一次,而且要在 aio_error 返回值不是einprogress的情況下使用。

重點看看返回值:

只需要將前面的**稍稍修改一下。

#include #include #include #include #include #include #include #include #include #define err_exit(msg) do  while(0)

int main()

ret=aio_return(&my_aiocb);

if(ret<0)

// 列印緩衝區內容,你並不知道核心是什麼時候將緩衝區中的 hello 複製到你的 buf 中的。

程式啟動後,在終端輸入了字串hello後回車。然後在程式的介面列印出 hello 的內容,注意後面換行符也被送到緩衝區了,aio_return 返回的是讀到的位元組數。

1-posix非同步io(aiocb)

3-posix非同步io(等待非同步操作)

**:

3 POSIX非同步IO 等待非同步操作

不知道你是否還記得執行緒中的 pthread join 函式,它可以等待指定的執行緒完成結束後才會返回。同樣的,在非同步 io 中,也有乙個函式,但是它不是 aio join,而是 aio suspend,它會一直等待,直到指定的非同步 io 操作完成才返回。int aio suspend cons...

Unix環境變數 POSIX非同步I O

非同步 i o 是針對同步 i o 提出的概念,它不需要執行緒等待 i o 結果,而只需要請求進行傳輸,然後系統會自動完成 i o 傳輸,結束或者出現錯誤時會產生相應的 i o 訊號,使用者程式只需要設定好對應的訊號陷入函式,即可處理乙個非同步 i o 事件。include struct aiocb...

I O限制非同步操作

clr非非同步操作讀取檔案的過程圖 非非同步操作主要是因為每次請求硬體如 硬碟,網絡卡等 的執行緒都處於阻塞狀態,導致以後的請求都需要重新建立新的執行緒。導致執行緒上下文的切換頻繁。非同步io操作主要是通過每次的請求完硬體創造好irp,執行緒就會返回到執行緒池中,將來硬體完成任務時,會主動去執行緒池...