1. 程式人生 > >linux select函式用法

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)測試是哪個個檔案的狀態的變化。

測試程式,監視 標準輸入,然後打印出來

  1. #include <stdio.h>
  2. #include <errno.h>
  3. #include <stdlib.h> 
  4. #include <sys/types.h>
  5. #include <sys/time.h>
  6. #include <unistd.h> 
  7. int main()  
  8. {  
  9.         //int fds; 
  10.         int ret;  
  11.         char buf[100];  
  12.         int timecount;  
  13.         int maxfd;  
  14.         fd_set rfds;//設定監聽讀集合
  15.         struct timeval tv;//設定等待時間,0不等待,NULL一直等待。
  16.         FD_ZERO(&rfds);//清空集合
  17. /* 
  18. *   通常,一個程序啟動時,都會開啟 3 個檔案:標準輸入、標準輸出和標準出錯處理。這 
  19. *   3 個檔案分別對應檔案描述符為 0、1 和 2(也就是巨集替換 STDIN_FILENO、STDOUT_FILENO 
  20. *   和 STDERR_FILENO,鼓勵讀者使用這些巨集替換)。  
  21. */
  22.         FD_SET(STDIN_FILENO, &rfds);//把標準輸入控制代碼0加入到集合中
  23.         maxfd = STDIN_FILENO + 1;  
  24.         timecount = 0;  
  25.         while(1)  
  26.         {  
  27.             tv.tv_sec = 10;  
  28.             tv.tv_usec = 0;//設定等待時間
  29.             ret = select(maxfd, &rfds, NULL, NULL, &tv);  
  30.             if(ret<0)  
  31.             {  
  32.                 printf("select error, process will eixt\n");  
  33.                 exit(0);  
  34.             }  
  35.             elseif(FD_ISSET(STDIN_FILENO, &rfds))//測試是否有資料
  36.             {  
  37.                     fgets(buf, 100, stdin);  
  38.                     if (!strncasecmp(buf, "quit", 4))   
  39.                     {  
  40.                         printf("exit test!\n");  
  41.                         break;  
  42.                     }  
  43.                     printf("You input is %s\n",buf);  
  44.             }  
  45.             else
  46.             {  
  47.                 timecount++;  
  48.                 printf("\ntime out: %d\n", timecount);  
  49.             }  
  50.         }  
  51.         return 0;  
  52. }  

執行結果:

  1. [email protected]:/work/tmp/select/keypad# gcc select_key.c -o select  
  2. [email protected]:/work/tmp/select/keypad# ./select  
  3. hello  
  4. You input is hello  
  5. time out: 1  
  6. time out: 2  
  7. time out: 3  

相關推薦

linux select函式用法

轉載:http://blog.csdn.net/liujia2100/article/details/9004750?locationNum=1&fps=1 Select可以監控多個檔案控制代碼,監控檔案內容的變化,比如可讀可寫狀態的改變,利用select可以

linuxselect函式用法詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!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(

Linuxselect函式檔案描述符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); 當伺服器響應多個客戶端連線的時候,需要定義一個執行緒

linuxselect函式解析

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)當一個客戶同時處理多個套介面時,而這種情況

linuxselect()函式詳解

一.Select 函式詳細介紹 Select在Socket程式設計中還是比較重要的,可是對於初學Socket的人來說都不太愛用Select寫程式,他們只是習慣寫諸如connect、 accept、recv或recvfrom這樣的阻塞程式(所謂阻塞方式block

Linuxselect函式詳解

原貼:https://www.cnblogs.com/hjslovewcl/archive/2011/03/16/2314330.html一.Select 函式詳細介紹  Select在Socket程式設計中還是比較重要的,可是對於初學Socket的人來說都不太愛用Selec

Linuxselect函式例項

/* 函式說明:正常每隔一秒列印一個數字,當有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所指的檔案做各種鎖定或解除鎖定的動作。此函式