讀常規檔案是不會阻塞的,不管讀多少位元組,read一定會在有限的時間內返回。從終端裝置或網路讀則不一定,如果從終端輸入的資料沒有換行符,呼叫read讀終端裝置就會阻塞,如果網路上沒有接收到資料報,呼叫read從網路讀就會阻塞,至於會阻塞多長時間也是不確定的,如果一直沒有資料到達就一直阻塞在那裡。同樣,寫常規檔案是不會阻塞的,而向終端裝置或網路寫則不一定。
現在明確一下阻塞(block)這個概念。
當程序呼叫乙個阻塞的系統函式時,該程序被置於睡眠(sleep)狀態,這時核心排程其它程序執行,直到該程序等待的事件發生了(比如網路上接收到資料報,或者呼叫sleep指定的睡眠時間到了)它才有可能繼續執行。與睡眠狀態相對的是執行(running)狀態,在linux核心中,處於執行狀態的程序分為兩種情況:
正在被排程執行。cpu處於該程序的上下文環境中,程式計數器(eip)裡儲存著該程序的指令位址,通用暫存器裡儲存著該程序運算過程的中間結果,正在執行該程序的指令,正在讀寫該程序的位址空間。
就緒狀態。該程序不需要等待什麼事件發生,隨時都可以執行,但cpu暫時還在執行另乙個程序,所以該程序在乙個就緒佇列中等待被核心排程。系統中可能同時有多個就緒的程序,那麼該排程誰執行呢?核心的排程演算法是基於優先順序和時間片的,而且會根據每個程序的運**況動態調整它的優先順序和時間片,讓每個程序都能比較公平地得到機會執行,同時要兼顧使用者體驗,不能讓和使用者互動的程序響應太慢。
阻塞讀終端: 【block_readtty.c】
非阻塞讀終端 【nonblock_readtty.c】
非阻塞讀終端和等待超時 【nonblock_timeout.c】
注意
阻塞與非阻塞是對於檔案而言的,而不是read、write等的屬性;
對於終端裝置,預設是阻塞的。
#include
#include
#include
#include
#include
intmain
(int argc,
char
*ar**)
rsize =
write
(stdout_fileno, buf,10)
;return0;
}
呼叫結果
讀取標準輸入(stdin_fileno),裝置檔案預設阻塞,獲取鍵盤輸入,將輸入資料,寫入標準輸出(stdout_fileno),將內容也列印在螢幕上;
注:
標準輸入(stdin_fileno)、標準輸出(stdout_fileno)、標準錯誤(stderr_fileno)共用終端裝置(螢幕);
返回非零值:
實際read到的位元組數;
返回-1:
errno != eagain (或!= ewouldblock) read 出錯;
errno == eagain (或== ewouldblock) 設定了非阻塞讀,並且沒有資料到達;
返回0:
讀到檔案末尾;
2020/07/23 23:00
@luxurylu
Linux阻塞與非阻塞
1.阻塞 block 概念 指程序或執行緒在執行裝置操作或管道,或則網路時,不能獲取到資源就被掛起,直到滿足可操作的條件後在進行操作,被掛起的程序進入休眠狀態,從執行佇列移走,直到 等待的條件滿足才繼續執行。也就是執行到某些函式時必須等待某個事件發生函式才返回。2.非阻塞 non block 程序就...
Linux串列埠阻塞與非阻塞
linux串列埠程式設計的阻塞與否可以在open函式中設定,例如 開啟時使用 fd open usar1,o rdwr o noctty 阻塞式讀寫 fd open dev ttyat2 o rdwr o noctty o ndelay 非阻塞讀寫除了用open函式之外還可以在open函式之後用fc...
Linux阻塞和非阻塞
阻塞 休眠 呼叫是沒有獲得資源則掛起程序,被掛起的程序進入休眠狀態,呼叫的函式只有在得到結果之後才返回,程序繼續。非阻塞 休眠 是不能進行裝置操作時不掛起,或返回,或反覆查詢,直到可以進行操作為止,被呼叫的函式不會阻塞當前程序,而會立刻返回。因為阻塞的程序會進入休眠狀態,因此,必須確保有乙個地方能夠...