select関数の使い方c++

3493 ワード

select関数は非ブロックで使用され、1つのソケットまたは1組のソケットに信号がある場合に通知され、システムはselect関数を提供して多重入力/出力モデルを実現し、プロトタイプ:int select(int maxfd、fd_set*rdset、fd_set*wrset、fd_set*exset、struct timeval*timeout);
ヘッダファイルは、#includeと#includeです.
まず関数のパラメータについて簡単に紹介します.パラメータmaxfdは、監視が必要な最大のファイル記述子値+1である.rdset,wrset,exsetは,それぞれ検出が必要な可読ファイル記述子の集合,書き込み可能ファイル記述子の集合,および異常ファイル記述子の集合に対応する.struct timeval構造は、時間の長さを記述するために使用され、この時間内に監視する必要がある記述子がイベントが発生しなければ関数が返され、戻り値は0です.これらのパラメータには構造体に似たものがありますfd_set、これは何の名前ですか.まず、この意味を見てみましょう.これはファイル記述字(fd)のセットで、1つのfdを1人で表すなど、ファイル記述字、熟知しているでしょう.以前はこれを1つのファイルのパスとして保存していた場所です.つまり、1つのファイルのマークとして考えていましたよ.今は推測していません.以下でどのように紹介するか見てみましょう.
  fd_set            :
FD_ZERO(fd_set *fdset)             ,              ,         ,     ,            ,         ,         。
FD_SET(fd_set *fdset)                       。
FD_CLR(fd_set *fdset)                     。
FD_ISSET(int fd,fd_set *fdset)                    。

  。。。。。。      ,          ,                     ,      ,         。  ,UNIX              FD_SETSIZE,      fd_set      ,     1024,      <1024 fd。

          fd_set     ,    select        。

  :     fd  ?  ?        ?
readset                 。
writeset                。
exceptset                   。( :     )
timeout            ,        ,                   ,    0。

  select              fd     。         :
1.timeout=NULL(  :select      ,               )
2.timeout            (      :                     ,     )
3.timeout      ,    0(   :           ,      ,           )



   :        1 fd   。   :      ,             fd    1。   0 。    ,  recv(),              ,        ,        ,          .      。    select          (          ) 。

手順は次のとおりです.socket s;.....fd_set set; while(1){FD_ZERO(&set);//あなたのソケットの集合をクリアFD_SET(&set);//興味のあるソケットの集合に追加します.ここでは、データを読むソケットs select(0,&set,NULL,NULL,NULL)//ソケットが読めるかどうかをチェックします.//データがあるかどうかをチェックします(注意しますが、多くの場合)//ここでselectが間違っていないかif(FD_ISSET(&set)//sがこの集合の中にあるかどうかをチェックすると、{//selectはこの集合を更新し、その中の読めないソケットを削除します//条件に合ったソケットのみをこの集合の中にrecv(s,...);//////////////////////////////do something here }
  select         fd_set,     , fd_set   1  ,fd_set    bit           fd。 1    fd_set      8 fd。

(1)fd_set set;FD_ZERO(&set);set用ビット表示は00000000です.(2)fd=5の場合、FD_SET(fd,&set)を実行する.後setが00010000になる(5番目の位置は1)
(3)さらにfd=2,fd=1を加えると、setが00010011(4)になりselect(6,&set,0,0,0)ブロック待ち(5)fd=1,fd=2に読み取り可能なイベントが発生すると、selectが戻り、setが0000011になる.注意:イベント発生しないfd=5はクリアされる.
上記の議論に基づいて、selectモデルの特徴を簡単に得ることができる:(1)監視可能なファイル記述子の数はsizeof(fd_set)の値に依存する.
(2)selectが監視できるファイル記述子の上限を有効に突破できる.(3)fdをselectモニタセットに組み込むとともに、もう1つのデータ構造arrayを用いてselectモニタセットに格納されたfdを保存する.1つは、再selectが戻った後、arrayをソースデータとしてfd_setとしてFD_ISSET判定を行う.2つは、selectが戻った後に以前に加えられたイベントが発生していないfdをクリアし、selectが開始されるたびにarrayからfdを新たに取得して1つずつ加える(FD_ZERO先頭)、arrayをスキャンしながらfd最大値maxfdを取得し、selectの最初のパラメータに使用する.(4)selectモデルはselectの前にarrayをループし(fdを加えてmaxfdを取る)、selectが戻った後にarrayをループする必要があることがわかる(FD_ISSETは時間発生の有無を判断する).
select関数を使用するプロセスは、マクロFD_を呼び出すのが一般的です.ZEROが指定するfd_setクリアしてマクロFD_を呼び出すSETは、テストが必要なfdをfd_に追加します.set、次に関数selectテストfd_を呼び出すsetの中のすべてのfd、最後にマクロFD_を使いますISSETは、あるfdが関数select呼び出し後も対応するビットが1であるかどうかをチェックする.
単一ファイル記述の文字可読性をテストする例として、int isready(int fd){int rc;fd_set fds;struct timtv;FD_ZERO(&fds);FD_SET(fd,&fds);tv.tv_sec=tv.tv_sev_usec=0;rc= select(fd+1,&fds,NULL,&tv);if(rc<0)/errorreturn-1;return_ISSET(fd,&fds)?1:1:1:1:1:::::::::(rcr<0)//errorretrr return_ISSET(fd,&fds)?1:1 0;}