質問

while (xxx) {
    timeout.tv_sec=TIMEOUT;
    timeout.tv_usec=0;
    FD_ZERO(&set); 
    FD_SET(sd,&set);

    switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout))
    xxxxx
}

動作し

FD_ZERO(&set); 
FD_SET(sd,&set);

while (xxx) {
    timeout.tv_sec=TIMEOUT;
    timeout.tv_usec=0;

    switch (select(FD_SETSIZE,&set,NULL,NULL,&timeout))
    xxxxx
}

は来ない。での時間が、次回ものがループでは、タイムアウトの場合でもsdソケットを受けます。そしんでいただけるようにする廃棄物の資源として空を埋設定します。

誰も良い説明がなぜこれは、ともにこのような提案をどう避けるのですか?

役に立ちましたか?

解決

を選択し、タンパク質を修飾し、その引数になります。ならないかもしれません再初期化します。

い関心をオーバーヘッドコストの処理を完全にFD_SETのカーネルが少し重要なのFD_ZERO.またいだけを通過ご最大fdはFD_SETSZIZEを最小限にとどめ、カーネルの加工。おとえば:

switch (select((sd + 1),&set,NULL,NULL,&timeout))

より複雑な場合には複数のfdであり、通常の場で終わ維持に最大変数:

FD_SET(sd,&set);
if (sd > max) max = sd;
... repeat many times...

switch (select((max + 1),&set,NULL,NULL,&timeout))


また多数のファイル記述子との架のschleppingについて、あるべき姿の一部を代替の選択().だという言葉は使っていないのOSを使うものUnix系のOsが数:

  • リepoll()
  • のためのFreeBSD/NetBSD/OpenBSD/MacOS X,kqueue()
  • Solaris,/dev/poll

のApiが異なるが、基本的には状態カーネルインターフェースの維持の活動がファイルの内容に更新しました。一度fdのセットから通知されますイベントに関するfdなく継続できます。

他のヒント

の読み込みを選択なせます。返されるsetは、ファイル記述子とすることができます。すると、利用FD_ISSETインポートする場合設定します。

常に初期化のfd_set直前に使用しています。

この方法を選択します。しっかりと振って正しいお作法では、よれば、複数のソケットが開かれます。そのポイント:ご選択くソケットれば読みたいからソケットは、読み込みまたはrecvます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top