套接字 學習筆記三 select函式

2021-06-01 23:44:57 字數 1487 閱讀 3414

編寫linux應用程式時,經常會遇到需要檢查好幾個輸入狀態才能確定下一步行動的情況,這種情況可稱之為忙等待。在單使用者系統中執行乙個忙等待是可以接受的,它不停地掃瞄

輸入裝置看是否有資料,如果有資料到達才讀取它。這種做法很耗cpu時間。

select函式(這裡函式又稱呼叫、系統呼叫)檢查乙個由多個檔案描述符組成的集合;如果集合中有描述符處於輸入、輸出、出錯狀態,select就返回處於這些狀態的描述符個數。

描述符集合由資料結構fd_set實現,有一組定義好的巨集可用來操作這些集合:

#inckude

#include

void fd_zero(fd_set *fdset);                          //將fdset所指的集合初始化為空集

void fd_clr(int fd, fd_set *fdset);      //將描述符fd從fdset所指的集合中移除

void fd_set(int fd, fd_set *fdset);       //將描述符fd新增到fdset所指的集合中

void fd_isset(int fd, fd_set *fdset);            //判斷fd是否在集合中

fd_set結構中所容納的描述符數由fd_setsize指定。

select函式還有乙個超時值來防止它無限期地阻塞,這個超時值由結構體timeval結出:

#inckude

#include

struct timeval ;

timeout:有三種可能:

1.timeout=null(阻塞:直到有乙個fd位被置為1函式才返回)

3.timeout所指向的結構,時間設為0(非阻塞:函式檢查完每個fd後立即返回)

select函式的原型:

#inckude

#include

int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *errorfds, struct timeval *timeout);

select可同時判斷集合中是否有描述符處於可讀、可寫、出錯狀態,它阻塞以等待某個描述符處於這些狀態。引數nfds指定需要檢查的描述符數目,範圍是0-nfds-1。後面

的三個集合指標都可設為空,表示不進行這些狀態的檢查。如果沒有描述的狀態符合,select將在timeout指定的時間後返回0;如果timeout指標為空,函式將一直阻塞下去。

select返回時,描述符集合會被修改以指示哪些描述符正處於可讀寫或有錯狀態,用fd_isset找出需要注意的描述符。

select函式成功時返回狀態發生變化的描述符數,失敗返回-1並設定errno,可能的錯誤有:

ebadf                            無效的描述符

eintr                             因中斷產生的錯誤

einval                           nfds或timeout取值錯誤

套接字學習筆記

1.socket函式 int socket int domain,int type,int protocol 作用 建立套接字描述符 domain 協議族 af unix af unix域協議族,本機的程序通訊時使用 af inet internet協議族 af iso iso協議族 type 指定...

socket 套接字學習筆記

socket 方法 receive byte 從繫結的 socket 套接字接收資料,將資料存入接收緩衝區。send byte 將資料傳送到連線的 socket。accept 為新建連線建立新的 socket。注意 如果您使用的是面向連線的協議,則 remoteendpoint 屬性將獲取包含 so...

套接字學習

學習自 學習自 工程設定學習自 有darpa internet 位址 internet 套接字 本地節點的路徑名 unix套接字 ccitt x.25位址 你可以將x.25 套接字完全忽略 等套接字型別。這裡講的internet套接字。internet 套接字的兩種型別 什麼意思?有兩種型別的int...