form select multiple 某个字段是数组_你知道什么是Select函数吗?
Select函數:允許進程指示內核等待多個事件中的任何一個發生,并只在有一個或多個事件發生或經歷一段指定的時間后才喚醒它。
select man手冊
舉個栗子,我們可以調用Select,告訴內核僅僅在下列情況發生時才返回:
- 集合{1,4,5}中任何描述符準備好讀集合{2,7}中任何描述符準備好寫集合{1,4}中任何描述符由異常條件待處理已經經歷了10秒
我們調用Select告訴內核對哪些描述符感興趣以及等待多長時間。
/* According to POSIX.1-2001 */ #include /* According to earlier standards */ #include #include #include int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);int nfds 指定待測試的描述符個數,它應該被設置為待測試的最大數目+1。fd_set通常支持的最大描述符是1023+1。
如何設置下面3個參數中的每個參數指定一個還是多個描述符值是一個設計上的問題。select采用描述符集,通常是一個整數數組,其中每個整數中的每一位對應一個描述符。
舉個栗子:假設使用32位整數,那么該數組的每一個元素對應于描述符0-31,第二個元素對應于描述符32-63,以此類推。
#include /* According to earlier standards */ #include #include #include void FD_CLR(int fd, fd_set *set); int FD_ISSET(int fd, fd_set *set); void FD_SET(int fd, fd_set *set); void FD_ZERO(fd_set *set);我們可以分配一個fd_set數據類型的描述符集,并用這些宏設置或測試該集合中的每一位。
舉個栗子:我們定義一個fd_set類型的變量,然后打開描述符1、4、5對應的位。
fd_set rset;FD_ZERO(&rset);FD_SET(1,&rset);FD_SET(4,&rset);FD_SET(5,&rset);如果對readset、writeset、exceptset中的某一個條件不感興趣,我們可以把它設置為空指針。
fd_set *readfds 指定讓內核測試讀條件的描述符fd_set *writefds 指定讓內核測試寫條件的描述符
- fd_set *exceptfds 指定讓內核測試異常條件的描述符
目前支持的異常條件:
某個套接字的帶外數據到達。某個已設置為分組模式的偽終端存在可從其主端讀取的控制狀態信息。
- struct timeval *timeout
把該參數設置為NULL,阻塞,僅在有一個描述符準備好IO時才返回。tv_sec != 0 || tv_usec != 0 ,超時返回,或在有一個描述符準備好IO時返回。tv_sec == 0 || tv_usec == 0 ,立即返回,這稱為輪訓。
select函數修改由指針readset,writeset,exceptset所指向的描述符集,這3個參數都是值-結果參數。調用的時候,我們指定所關心的描述符值。返回的時候,結果將指示這些描述符已經就緒。函數返回后,我們使用FD_ISSET宏測試fd_set數據類型中的描述符。
小測試:
總結
以上是生活随笔為你收集整理的form select multiple 某个字段是数组_你知道什么是Select函数吗?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql client dev_ubu
- 下一篇: mysql 存储过程 无限分类_mysq