linux select函式用法
轉載:http://blog.csdn.net/liujia2100/article/details/9004750?locationNum=1&fps=1
Select可以監控多個檔案控制代碼,監控檔案內容的變化,比如可讀可寫狀態的改變,利用select可以實現非阻塞而不會讓執行緒掛起,提高系統的執行效率。
比如可以同時 監控 鍵盤輸入和滑鼠輸入,如果鍵盤有訊號,可以去操作鍵盤,如果滑鼠有訊號,去處理滑鼠事件,如果都沒有訊號,則可以不讓執行緒掛起而繼續向下執行。
1、 所需標頭檔案:
#include <sys/types.h>
#include <sys/time.h>
#include <unistd.h>
2、函式原型
int select(int numfds,fd_set *readfds, fd_set *writefds,fd_set *exeptfds, struct timeval *timeout)
numfds:需要檢查的號碼最高的檔案描述符加 1
readfds:由 select()監視的讀檔案描述符集合
writefds:由 select()監視的寫檔案描述符集合
exeptfds:由 select()監視的異常處理檔案描述符集合
timeout
struct timeval {
long tv_sec; /* second */
long tv_unsec; /* and microseconds*/
}
NULL:永遠等待,直到捕捉到訊號或檔案描述符已準備好為止
具體值:struct timeval 型別的指標,若等待為 timeout 時間還沒有檔案描符準備好,就立即返回
0:從不等待,測試所有指定的描述符並立即返回
函式返回值
成功:準備好的檔案描述符
−1:出錯
3.、select 檔案描述符處理函式
FD_ZERO(fd_set *set) 清除一個檔案描述符集
FD_SET(int fd,fd_set *set) 將一個檔案描述符加入檔案描述符集中
FD_CLR(int fd,fd_set *set) 將一個檔案描述符從檔案描述符集中清除
FD_ISSET(int fd,fd_set *set) 測試該集中的一個給定位是否有變化
使用步驟:
1、定義檔案描述符
如:int int fds[2];
然後:fds[0] = open(....),開啟檔案。
2、定義要監視的集合
如:fd_set inset1,inset2;
初始化集合: FD_ZERO(&inset1);
把要監視的檔案描述符新增進集合: FD_SET(fds[0],&inset1); 可以新增多個。
3、設定監視的時間:
0:從不等待
NULL:永遠等待
定義時間結構體:
struct timeval tv;
設定時間,如:
tv.tv_sec=2;tv.tv_usec=0;
注意當每次迴圈執行到select時,原來tv的值會被清零,必須重新設定
4、取出最大的那個檔案
maxfd = fds[0]>fds[1] ? fds[0] : fds[1];
5、設定select(maxfd+1,&inset1,&inset2,NULL,&tv)
6、如果select返回大於0
可以用FD_ISSET(fds[0],&inset1)測試是哪個個檔案的狀態的變化。
測試程式,監視 標準輸入,然後打印出來
- #include <stdio.h>
- #include <errno.h>
- #include <stdlib.h>
- #include <sys/types.h>
- #include <sys/time.h>
- #include <unistd.h>
- int main()
- {
- //int fds;
- int ret;
- char buf[100];
- int timecount;
- int maxfd;
- fd_set rfds;//設定監聽讀集合
- struct timeval tv;//設定等待時間,0不等待,NULL一直等待。
- FD_ZERO(&rfds);//清空集合
- /*
- * 通常,一個程序啟動時,都會開啟 3 個檔案:標準輸入、標準輸出和標準出錯處理。這
- * 3 個檔案分別對應檔案描述符為 0、1 和 2(也就是巨集替換 STDIN_FILENO、STDOUT_FILENO
- * 和 STDERR_FILENO,鼓勵讀者使用這些巨集替換)。
- */
- FD_SET(STDIN_FILENO, &rfds);//把標準輸入控制代碼0加入到集合中
- maxfd = STDIN_FILENO + 1;
- timecount = 0;
- while(1)
- {
- tv.tv_sec = 10;
- tv.tv_usec = 0;//設定等待時間
- ret = select(maxfd, &rfds, NULL, NULL, &tv);
- if(ret<0)
- {
- printf("select error, process will eixt\n");
- exit(0);
- }
- elseif(FD_ISSET(STDIN_FILENO, &rfds))//測試是否有資料
- {
- fgets(buf, 100, stdin);
- if (!strncasecmp(buf, "quit", 4))
- {
- printf("exit test!\n");
- break;
- }
- printf("You input is %s\n",buf);
- }
- else
- {
- timecount++;
- printf("\ntime out: %d\n", timecount);
- }
- }
- return 0;
- }
執行結果:
- [email protected]:/work/tmp/select/keypad# gcc select_key.c -o select
- [email protected]:/work/tmp/select/keypad# ./select
- hello
- You input is hello
- time out: 1
- time out: 2
- time out: 3
相關推薦
linux select函式用法
轉載:http://blog.csdn.net/liujia2100/article/details/9004750?locationNum=1&fps=1 Select可以監控多個檔案控制代碼,監控檔案內容的變化,比如可讀可寫狀態的改變,利用select可以
linux之select函式用法詳解
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
linux select函式詳解
在Linux中,我們可以使用select函式實現I/O埠的複用,傳遞給 select函式的引數會告訴核心: •我們所關心的檔案描述符 •對每個描述符,我們所關心的狀態。(我們是要想從一個檔案描述符中讀或者寫,還是關注一個描述符中是否出現異常)
I/O複用模型之select函式用法——伺服器開發
現在我們介紹另外一種常用併發伺服器開發的技術——select函式I/O複用模型。 先來介紹select及相關的函式: select函式的作用是監聽指定的多個I/O的檔案描述符,在設定的時間內阻塞,當有一個或者多個I/O埠滿足某個“讀”或者“寫”的條件,則在fd_set型別
linux C函式之access函式的用法【轉】
1.函式功能: 檢查呼叫程序是否可以對指定的檔案執行某種操作。 2.函式原型: 1)函式標頭檔案 #include <stdio.h> #include <unistd.h> 2)函式 int access(
Linux下select函式檔案描述符0狀態的問題
當然是在有輸入或者輸出時檔案描述符的讀寫狀態改變咯,比如標準輸入的檔案描述符是0,如果用select來等待0號檔案描述符,那麼當在鍵盤上敲字元時開始,就是檔案描述符的讀寫狀態改變之時,這時select函式就會返回;對於套接字描述符來說也是這樣,用select來等待一個伺服器描
Linux I/O複用之select函式詳解
置頂 2017年02月12日 20:50:08 難免有錯_ 閱讀數:7438更多 select函式的功能和呼叫順序 使用select函式時統一監視多個檔案描述符的: 1、 是否存在套接字接收資料? 2、 無需阻塞傳輸資料的套接字有哪些? 3、 哪些套接字發生了
linux裡的select函式和一種併發伺服器的實現
select函式 函式原型: int select(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *t
Linux socket程式設計示例3 select函式的使用
1.select函式簡介 int select(int maxfdp,fd_set *readfds,fd_set *writefds,fd_set *errorfds,struct timeval*timeout); 當伺服器響應多個客戶端連線的時候,需要定義一個執行緒
linux之select函式解析
select()的機制中提供一fd_set的資料結構,實際上是一long型別的陣列, 每一個數組元素都能與一開啟的檔案控制代碼(不管是Socket控制代碼,還是其他 檔案或命名管道或裝置控制代碼)建立聯絡,建立聯絡的工作由程式設計師完成, 當呼叫select()時,由核心根
linux中shell的函式用法
1.語法 方法1: 函式名() { 函式體 return n } 方法2: function 函式名() { 函式體 return n } 2.呼叫函式 呼叫函式,在函式體外寫函式的名字即可,下面有一個簡單的指令碼來舉例 #!/bin/bash
select函式詳細用法解析
1.表頭檔案 #include #include #include 2.函式原型 int select(int n,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeo
UNIX /Linux中的memcpy函式用法詳解
原型:extern void *memcpy(void *dest, void *src, unsigned int count); 用法:#include <string.h>
linux setsockopt函式的用法
1.closesocket(一般不會立即關閉而經歷TIME_WAIT的過程)後想繼續重用該socket: BOOL bReuseaddr=TRUE; setsockopt(s,SOL_SOCKET ,SO_REUSEADDR,(const char*)&bReuse
linux網路程式設計之用select函式實現io複用(基於TCP)引發的思考
1、基本概念 IO多路複用是指核心一旦發現程序指定的一個或者多個IO條件準備讀取,它就通知該程序。IO多路複用適用如下場合: (1)當客戶處理多個描述字時(一般是互動式輸入和網路套介面),必須使用I/O複用。 (2)當一個客戶同時處理多個套介面時,而這種情況
linux:select()函式詳解
一.Select 函式詳細介紹 Select在Socket程式設計中還是比較重要的,可是對於初學Socket的人來說都不太愛用Select寫程式,他們只是習慣寫諸如connect、 accept、recv或recvfrom這樣的阻塞程式(所謂阻塞方式block
Linux下select函式詳解
原貼:https://www.cnblogs.com/hjslovewcl/archive/2011/03/16/2314330.html一.Select 函式詳細介紹 Select在Socket程式設計中還是比較重要的,可是對於初學Socket的人來說都不太愛用Selec
Linux的select函式例項
/* 函式說明:正常每隔一秒列印一個數字,當有fd被設定時,就馬上執行操作。而不是被阻塞住 */ #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #inclu
select函式詳細用法解析(轉自:zhenhuaqin)
1.表頭檔案 #include <unistd.h> #include <stdlib.h> #include <fcntl.h> #include <sys/select.h> 2.函式原型 int s
linux下C語言中的flock函式用法 .
表頭檔案 #include<sys/file.h> 定義函式 int flock(int fd,int operation); 函式說明 flock()會依引數operation所指定的方式對引數fd所指的檔案做各種鎖定或解除鎖定的動作。此函式