Selectまとめ


#include <sys/select.h>
#include <sys/time.h>
int select(int maxfdpl, fd_set *readset, fd_set *write, fd_set  *exceptset, const struct timeval *timeout);

≪戻り値|Return Value|emdw≫:関数の戻り値は、すべての記述子セットにわたる準備完了の合計桁数を表します.
記述子が準備される前にタイマが到着した場合、0を返します.
戻り-1は、エラー(例えば、本関数がキャプチャされたという信号によって中断された)を表す.
1 int maxfdpは整数値であり、セット内のすべてのファイル記述子の範囲、すなわちすべてのファイル記述子の最大値に1を加え、最大値ではなく記述子の個数を指定し、記述子は0から始まる.ヘッダファイルで定義したFD_SETSIZE定数値はデータ型fd_setの記述子の総数であり、その値は通常1024である.
2 readset、writeset、exceptsetカーネルに読み取り、書き込み、異常条件をテストさせる記述子を指定します.ある条件に興味がなければ、空のポインタに設定できます.
現在サポートされている例外は2つのみです.
(1)あるソケットの帯域外データが到着する.
(2)パケットモードとしてセットされたダミー端末には、そのマスタから読み取ることができる制御状態情報が存在する.
fd_の場合setタイプの変数私たちができることは、変数を宣言し、変数に同じタイプの変数の値を割り当てるか、以下のマクロを使用して制御することです.
#include <sys/select.h>   
int FD_ZERO(int fd, fd_set *fdset);   //clear all bits in fdset*
int FD_CLR(int fd, fd_set *fdset);    //turn on the bit for fd in fdset
int FD_SET(int fd, fd_set *fd_set);   //turn off the bit for fd in fdset
int FD_ISSET(int fd, fd_set *fdset);  //is the bit for fd on in fdset

3 timeout:指定した記述子のいずれかをカーネルが待機するのにどれくらいの時間がかかるかを通知します.
struct timeval{      
        long tv_sec;   /*  */
        long tv_usec;  /*  */   
}

3つのケースがあります.
timeout==NULL待ち時間が無限に長い.待機は1つの信号で中断することができる.記述子が準備されているか、信号がキャプチャされている場合、関数は戻ります.信号がキャプチャされると、select関数は-1を返し、変数erroをEINTRに設定します.
    timeout->tv_sec == 0 &&timeout->tv_usec==0は待たずに直接戻ります.ディスクリプタセットに追加されたディスクリプタはテストされ、要求を満たすディスクリプタの数が返されます.この方法はポーリングにより,ブロックなく複数のファイル記述子状態を得た.
    timeout->tv_sec !=0 ||timeout->tv_usec!= 0指定された時間を待ちます.記述子が条件を満たしているか、タイムアウト時間を超えている場合、関数は返されます.タイムアウト時間が切れそうになっても条件を満たしていない場合は、0を返します.1つ目の場合、待機も信号によって中断されます.