日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

I/O多路转接之 select

發布時間:2025/4/16 编程问答 56 豆豆
生活随笔 收集整理的這篇文章主要介紹了 I/O多路转接之 select 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.


系統提供select函數來實現多路復用輸入/輸出模型。


作用:select系統調用是用來讓我們的程序監視多個文件句柄的狀態變化的。程序會停在select這里等待,直到被監視的文件句柄有一個或多個發生了狀態改變。


函數原型:

參數說明:

int nfds:需要監視的最大文件描述符值+1;

fd_set *readfds & *writefds & *exceptfds:指向文件描述符的指針;這三個描述符集說明了我們關心的可讀、可寫或處于異常條件的各個描述符;

struct timeval *timeout:需要等待的時間,為NULL,則select一直阻塞,知道某個文件描述符發生了事件,為0,僅僅檢測描述集合的狀態,立即返回,不等待外部事件的發生。

struct?timeval{long?tv_sec;????????/*?seconds?*/long?tv_usec;???????/*?microseconds?*/ };

函數返回值:

成功:返回就緒描述符的個數,0表示timeout結束,沒有描述符完成就緒;

失敗:-1,此時狀態描述參數和timeout都變成不可預測的,錯誤信息存在errno中。



對fd_set數據類型可以進行的處理是:

分配一個這種類型的變量;

將這種類型的一個變量值賦予同類型的另一個變量;或對于這種類型的變量使用下列四個函數中的一個。

void?FD_CLR(int?fd,?fd_set?*set);????//清除描述詞組set中相關的fd的位 int?FD_ISSET(int?fd,?fd_set?*set);???//測試描述詞組set中相關fd的位是否為真 void?FD_SET(int?fd,?fd_set?*set);????//設置描述詞組set中相關的fd位 void?FD_ZERO(fd_set?*set);???????????//清除描述詞組set的全部位

select的缺點:

(1)每次調用select,都需要把fd集合從用戶態拷貝到內核態,這個開銷在fd很多時會很大

(2)同時每次調用select都需要在內核遍歷傳遞進來的所有fd,這個開銷在fd很多時也很大

(3)select支持的文件描述符數量太小了,默認是1024

select的優點:

(1)相較于之前多線程的方法,使用select不用創建線程,更方便

(2)select目前幾乎在所有的平臺上都支持,其良好跨平臺支持也是它的一個優點?


轉載于:https://blog.51cto.com/10324228/1837181

總結

以上是生活随笔為你收集整理的I/O多路转接之 select的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。