2017-02-28 20 views
2

私はselect(相違するソースから)のmanページを読んでいますが、まっすぐな説明を得ることはできません。そのように同じFD_SETに:(誤っ例):今すぐ同じソケットfdをfd_setに2回追加してからselect

fd_set readfds; 


FD_ZERO(&readfds); 
FD_SET(s1, &readfds); 
.... 
FD_SET(s1, &readfds); 

s1 = socket(...); 
connect(s1, ...)... 

は、今私は二回ソケットを追加すると言うことができます:

は、私はこのような接続済みのソケットを持っているとしましょう私はselectを呼び出します:

int rv = select(n, &readfds, NULL, NULL, &tv); 

if (rv == -1) { 
    perror("select"); // error occurred in select() 
} 
else if (rv == 0) { 
    printf("Timeout occurred! No data after 10.5 seconds.\n"); 
} 
else { 
    // one the descriptors have data 
    ..... 
} 

データがソケットから送信されている場合、どちらのFDもreadyまたはonlとして設定されます最初に私が追加したのは? FD_SET以来

+1

いいえ、同じソケットを複数回同じ読み取りセットに設定しても問題は発生しません。 S1はreadfdsのインデックスと考えることができます。 – Mazhar

+0

ソケット番号のリストは、(現在のシナリオでは) 'readfds'データ構造体内のビットマップとして実装されます。同じビットを複数回設定すると、FDSET()への呼び出しには、最初の特定のソケット番号を呼び出す – user3629249

答えて

6

は(言葉の数学的な意味での)セット、任意のファイルディスクリプタがそれのいずれかでであるか、それはないです。同じディスクリプタを複数回セットに追加することは効果がありません。

関連する問題