1. select系統呼叫select系統呼叫是用來讓我們的程式監視多個檔案描述符的狀態變化的。程式會停在select這裡等待,直到被監視的檔案描述符有某一個或多個發生了狀態改變。select()的機制中提供一fd_set的資料結構,實際上是一long型別的陣列,每一個數組元素都能與一開啟的檔案控制代碼建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select()時,由核心根據IO狀態修改fd_set的內容,由此來通知執行了select()的程序哪些Socket或檔案可讀可寫。select函式原型:#include <sys/select.h> #include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);ndfs:select監視的檔案控制代碼數,視程序中開啟的檔案數而定,一般設為要監視各檔案中的最大檔案描述符值加1。readfds:這個檔案描述符集合監視檔案集中的任何檔案是否有資料可讀,當select函式返回的時候,readfds將清除其中不可讀的檔案描述符,只留下可讀的檔案描述符。writefds:這個檔案描述符集合監視檔案集中的任何檔案是否有資料可寫,當select函式返回的時候,writefds將清除其中不可寫的檔案描述符,只留下可寫的檔案描述符。exceptfds:這個檔案集將監視檔案集中的任何檔案是否發生錯誤,其實,它可用於其他的用途,例如,監視帶外資料OOB,帶外資料使用MSG_OOB標誌傳送到套接字上。當select函式返回的時候,exceptfds將清除其中的其他檔案描述符,只留下標記有OOB資料的檔案描述符。timeout:本次select()的超時結束時間。這個引數至關重要,它可以使select處於三種狀態:(1)若將NULL以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;(2)若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函式,不管檔案描述符是否有變化,都立刻返回繼續執行,檔案無變化返回0,有變化返回一個正值;(3)timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。函式的返回值:正值:表示監視的檔案集中有檔案描述符符合要求零值:表示select監視超時負值:表示發生了錯誤,錯誤值由errno指定。宏操作:FD_ZERO(fd_set *set): 用來清除描述片語set的全部位FD_SET(int fd,fd_set*set): 用來設定描述片語set中相關fd的位FD_ISSET(int fd,fd_set *set): 用來測試描述片語set中相關fd 的位是否為真FD_CLR(inr fd,fd_set* set): 用來清除描述片語set中相關fd 的位注意事項:(1)對於可寫性的檢查,最好放在需要寫資料的時候進行檢查。如果和可讀性放在同一個地方進行檢查,那麼select很可能每次都會因為可寫性檢查成功而返回。 (2)select()呼叫會清空傳遞給它的集合引數中的內容,也就是會清空readfds、writefd、exceptfds這三個指標引數所指定的描述符集合。因此,在每次呼叫select()之前,必須重新初始化並把需要監視的描述符填寫到相應的描述符集合中。select()呼叫也會清空timeout指標所指向的struct timeval結構,所以在每次呼叫select()之前也要重新填充timeout指標所指向的struct timeval結構。
1. select系統呼叫select系統呼叫是用來讓我們的程式監視多個檔案描述符的狀態變化的。程式會停在select這裡等待,直到被監視的檔案描述符有某一個或多個發生了狀態改變。select()的機制中提供一fd_set的資料結構,實際上是一long型別的陣列,每一個數組元素都能與一開啟的檔案控制代碼建立聯絡,建立聯絡的工作由程式設計師完成,當呼叫select()時,由核心根據IO狀態修改fd_set的內容,由此來通知執行了select()的程序哪些Socket或檔案可讀可寫。select函式原型:#include <sys/select.h> #include <sys/time.h>#include <sys/types.h>#include <unistd.h>int select(int nfds, fd_set * readfds, fd_set * writefds, fd_set * exceptfds, const struct timeval * timeout);ndfs:select監視的檔案控制代碼數,視程序中開啟的檔案數而定,一般設為要監視各檔案中的最大檔案描述符值加1。readfds:這個檔案描述符集合監視檔案集中的任何檔案是否有資料可讀,當select函式返回的時候,readfds將清除其中不可讀的檔案描述符,只留下可讀的檔案描述符。writefds:這個檔案描述符集合監視檔案集中的任何檔案是否有資料可寫,當select函式返回的時候,writefds將清除其中不可寫的檔案描述符,只留下可寫的檔案描述符。exceptfds:這個檔案集將監視檔案集中的任何檔案是否發生錯誤,其實,它可用於其他的用途,例如,監視帶外資料OOB,帶外資料使用MSG_OOB標誌傳送到套接字上。當select函式返回的時候,exceptfds將清除其中的其他檔案描述符,只留下標記有OOB資料的檔案描述符。timeout:本次select()的超時結束時間。這個引數至關重要,它可以使select處於三種狀態:(1)若將NULL以形參傳入,即不傳入時間結構,就是將select置於阻塞狀態,一定等到監視檔案描述符集合中某個檔案描述符發生變化為止;(2)若將時間值設為0秒0毫秒,就變成一個純粹的非阻塞函式,不管檔案描述符是否有變化,都立刻返回繼續執行,檔案無變化返回0,有變化返回一個正值;(3)timeout的值大於0,這就是等待的超時時間,即select在timeout時間內阻塞,超時時間之內有事件到來就返回了,否則在超時後不管怎樣一定返回,返回值同上述。函式的返回值:正值:表示監視的檔案集中有檔案描述符符合要求零值:表示select監視超時負值:表示發生了錯誤,錯誤值由errno指定。宏操作:FD_ZERO(fd_set *set): 用來清除描述片語set的全部位FD_SET(int fd,fd_set*set): 用來設定描述片語set中相關fd的位FD_ISSET(int fd,fd_set *set): 用來測試描述片語set中相關fd 的位是否為真FD_CLR(inr fd,fd_set* set): 用來清除描述片語set中相關fd 的位注意事項:(1)對於可寫性的檢查,最好放在需要寫資料的時候進行檢查。如果和可讀性放在同一個地方進行檢查,那麼select很可能每次都會因為可寫性檢查成功而返回。 (2)select()呼叫會清空傳遞給它的集合引數中的內容,也就是會清空readfds、writefd、exceptfds這三個指標引數所指定的描述符集合。因此,在每次呼叫select()之前,必須重新初始化並把需要監視的描述符填寫到相應的描述符集合中。select()呼叫也會清空timeout指標所指向的struct timeval結構,所以在每次呼叫select()之前也要重新填充timeout指標所指向的struct timeval結構。