程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> I/O多路復用-select()系統調用

I/O多路復用-select()系統調用

編輯:關於C語言

select()系統調用可以使進程檢測同時等待的多個I/O設備,當沒有設備准備好時,select()阻塞,其中任一設備准備好時,select()就返回。



    


    


    


    


    


    


    


    



select的第一個參數是文件描述符集中要被檢測的比特數,這個值必須至少比待檢測的最大文件描述符大1;參數readfds指定了被讀監控的文件描述符集;參數writefds指定了被寫監控的文件描述符集;而參數exceptfds指定了被例外條件監控的文件描述符集。參數timeout起了定時器的作用:到了指定的時間,無論是否有設備准備好,都返回調用。

timeval的結構定義如下:
struct timeval{
    long tv_sec; //表示幾秒
    long tv_usec; //表示幾微妙
}

timeout取不同的值,該調用就表現不同的性質:

1.timeout為0,調用立即返回;
2.timeout為NULL,select()調用就阻塞,直到知道有文件描述符就緒;
3.timeout為正整數,就是一般的定時器。

select調用返回時,除了那些已經就緒的描述符外,select將清除readfds、writefds和exceptfds中的所有沒有就緒的描述符。select的返回值有如下情況:

1.正常情況下返回就緒的文件描述符個數;
2.經過了timeout時長後仍無設備准備好,返回值為0;
3.如果select被某個信號中斷,它將返回-1並設置errno為EINTR。
4.如果出錯,返回-1並設置相應的errno。

系統提供了4個宏對描述符集進行操作:



    


    


    


    


    



宏FD_SET設置文件描述符集fdset中對應於文件描述符fd的位(設置為1),宏FD_CLR清除文件描述符集 fdset中對應於文件描述符fd的位(設置為0),宏FD_ZERO清除文件描述符集fdset中的所有位(既把所有位都設置為0)。使用這3個宏在調用select前設置描述符屏蔽位,在調用select後使用FD_ISSET來檢測文件描述符集fdset中對應於文件描述符fd的位是否被設置。

select的使用方法:

1. 將要監控的文件添加到文件描述符集
2. 調用Select開始監控
3. 判斷文件是否發生變化

如下:

FD_ZERO(&fds); //清空集合
FD_SET(fd1,&fds); //設置描述符
FD_SET(fd2,&fds); //設置描述符
maxfdp=fd1+1; //描述符最大值加1,假設fd1>fd2
switch(select(maxfdp,&fds,NULL,NULL,&timeout))
case -1: exit(-1);break; //select錯誤,退出程序
case 0:break;
default:if(FD_ISSET(fd1,&fds)).... //測試fd1是否可讀

可運行源代碼:



    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    


    



GCC編譯通過,可以自行測試運行,本程序測試了兩個描述符,一個標准輸入,一個是文件描述符。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved