linux阻塞与非阻塞(linux阻塞 非阻塞)
在非阻塞模式上怎么知道recv接收數據完成?
以linux下 tcp socket編程為例:阻塞就是 recv/read的時候 socket接收緩沖區要是有數據就讀, 沒數據我就一直睡覺賴著不走,直到有數據來了讀完我才走。
send/write的時候,要是發送緩沖區滿了,沒有空間繼續發送了我也一直睡覺賴著不走,直到發送緩沖區騰出足夠的空間讓我把數據全部塞到發送緩沖區里我才走。
(當然如果你通過setsockopt設置了讀寫超時,超時時間到了還是會返回-1和EAGAIN,不再睡覺等待)
非阻塞就是recv/read的時候,要是接收緩沖區有數據我就讀完,沒有數據我直接帶著返回的-1和EGAIN走人,絕不睡覺等待耽誤時間。
write/send的時候, 要是發送緩沖區有足夠的空間,就立刻把數據塞到發送緩沖區去,然后走人,如果發送緩存區滿了,空間不足,那直接帶著返回的-1和EAGAIN走人。至于IO多路復用,首先要理解的是,操作系統為你提供了一個功能,當你的某個socket接收緩存區有數據可讀,或者發送緩沖區有空間可寫的時候,它可以給你一個通知。
這樣當配合非阻塞的socket使用時,只有當系統通知我哪個描述符可讀了,我才去執行read操作,可以保證每次read都能讀到有效數據而不做純返回-1和EAGAIN的無用功。
寫操作類似。
操作系統的這個功能通過select/poll/epoll之類的系統調用函數來使用,這些函數都可以同時監視多個描述符的讀寫就緒狀況,這樣,多個描述符的I/O操作都能在一個線程內完成,這就叫I/O多路復用,這里的“復用”指的是復用同一個線程。至于事件驅動,其實是I/O多路復用的一個另外的稱呼。至于異步同步,我們常見的linux下的網絡編程模型大部分都是同步io,以讀操作為例,本質上都是需要用戶調用read/recv去從內核緩沖區把數據讀完再處理業務邏輯。
異步io則是內核已經把數據讀好了,用戶直接處理邏輯。
異步IO在linux下一般是用aio庫。
linux accept()函數一直處于阻塞狀態,什么原因?
accept()函數就是阻塞的啊,要等待接收到有客戶端請求才可以進行后續的操作,你所謂的不可以是指什么?
open系統使用技巧?
open系統是多種語言、環境的一種函數。
LINUX中open函數作用:打開和創建文件。PB程序語言中open功能:打開窗口。
對于open系統來說,第三個參數僅當創建新文件時(即 使用了O_CREAT 時)才使用,用于指定文件的訪問權限位。
pathname 是待打開/創建文件的POSIX路徑名;flags用于指定文件的打開/創建模式,這個參數可由以下常量通過邏輯位或邏輯構成。
打開/創建文件時,至少得使用上述三個常量中的一個。
以下常量是選用的:
1.設置為非阻塞模式
2.以下三個常量同樣是選用的,它們用于同步輸入輸出
3.open返回的文件描述符一定是最小的未被使用的描述符。
總結
以上是生活随笔為你收集整理的linux阻塞与非阻塞(linux阻塞 非阻塞)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 热血海贼王安卓版破解版(热血海贼王安卓版
- 下一篇: 使Java具有响应性的框架和工具包:Rx