int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout)について
解決済
- 気になる
- 0
- 件
- 質問日時:
- 回答数:2件
見当違いな質問かもしれませんがお願いします。
複数のソケットを監視する際にselectを使う場合のことですが、
selectの動作と戻り値について疑問があります。
http://www.linux.or.jp/JM/html/LDP_man-pages/man …
ここを参照すると、selectの戻り値は
「更新された 3 つのディスクリプタ集合に含まれているディスクリプタの数 (つまり、 readfds, writefds, exceptfds 中の 1 になっているビットの総数) を返す。」
とあります。
私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識だとreadfds,writefdsが引数として与えられているとしても、
どちらかのfd_setのうち、一つでも動きがあればselect文は
抜けてしまうことになります。とすると、戻り値として
「readfds, writefds, exceptfds 中の 1 になっているビットの総数」
は常に1ということになってしまいます。しかし、総数というからには
複数同時に1になることもあるはずです。
私の認識が間違っているとは思うのですが、どう間違っているのかわかりません。
select文の動きについて詳しく教えていただけないでしょうか。
または良いページがあれば教えてください。
No.1ベストアンサー
- 回答日時:
>私の中でselectは登録してあるFDのうち、一つでも動きがあれば即座にselectを抜けるもの、という認識です。
この認識はあっています。
しかし、selectを呼び出す以前にOKになっているFDがあれば、それらは全てビットがONになります。
話しを簡単にする為に、受信のみのソケットを3つ作成したとします。
これらの3つのソケットに向けて相手が電文を送ったとします。
その状態でまだ、こちらはselectを呼び出さずにいます。しばらくしてから、selectを呼び出すと、selectは即座にリターンし、3つのビットが一度にONになっているはずです。
一方、相手が、一切電文を送ってない状態で、selectを呼び出した場合は、何れかのビットがONになればリターンするので、そのときは、貴方が想像しているように
ビットの総数は1になる可能性が高いです。
従って、相手が電文を送る前にselectを呼び出すか、送った後にselectを呼び出すかは、その時のタイミングにより異なります。従って、ビット数の総和が常に1であるとは、考えない方が無難です。(1つのソケットしか使用しない場合は別ですが・・・)
いつもありがとうございます。
>selectを呼び出す以前にOKになっているFD
あ。。言われてみればその通りでした。
適切なご回答大変助かりました。
No.2
- 回答日時:
#1 さんの回答で合っていると思います。
例えば、selectをループの中に入れて使用するとして、ループして何か処理してる間に複数のFDが使用可能になっている可能性は十分にあります。
↓こんなイメージ
for(;;){
select();
if(sock1->recv()>0){ }
if(sock2->recv()>0){ }
if(sock3->recv()>0){ }
}
余談ですが、
ご使用になるのがwinsockだと微妙に使用法が違います。
返るのはビット列ではなくて、ディスクリプタの配列になるようです。(結局FD_ISSETで検知するので違いは吸収されますが)
また、引数のnにはディスクリプタの最大値+1(以上)を指定しないと期待通り動作しないはずですが、winsockではこの値は見てませんのでなんでも良いです。
さらに、readfds、writefds、exceptfdsを全てNULLにしてタイマーとして動作させようとすると、確かコンパイルエラーになったと思います。
私が使用したのはBorlandなので、VCだとまた事情が異なるかもしれません。
ありがとうございます。
そうですね。他に処理している間にも
複数のクライアントからデータが送られてくることが
ありますね。完全に考えから抜け落ちてました。
使用するのはUnixですが、winsockのお話も
参考になりました。winsockではタイマーにならないんですか。。
昨日タイマーになるということを知ったばかりだったのでタイムリーでした(笑)
Borland環境はないですが、知識として蓄積させていただきます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- MySQL 下の画像はSQLの4大命令の性質をまとめたものであるらしいです UPDATE INSERT DELE 1 2023/06/07 15:36
- Oracle SQL update方法 2 2022/06/22 14:07
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- MySQL 共通点はあります。何が違うのでしょうか? 1 2023/01/27 05:22
- Visual Basic(VBA) 動きっぱなしです。止め方とプロシージャの間違いを教えて下さい! 5 2022/08/15 23:08
- Excel(エクセル) ②Excel 簡単にシートコピーしたら前日の残高と日付を変更させたい→マクロの記録でエラーが出ます 8 2022/07/16 20:40
- PHP PHP MySql ページング 2 2022/09/20 06:38
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Excel(エクセル) 表示形式、文字列セル(列)に数式を入力するには マクロ 1 2022/09/18 10:53
- Visual Basic(VBA) ExcelVBA No.を自動連番で設定をしながらデータ入力をしたい 2 2022/08/03 18:19
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jQuery セレクトボックスで選択...
-
ブラウザの戻るボタンを押した...
-
セレクトの値を取得できない
-
JavaScriptでプルダウンのサイ...
-
Selectの中身をfor文で入れる
-
Selectボックスの幅を自動で広...
-
プルダウン 項目が多いので先頭...
-
プルダウンとテキストの連動
-
document.form で nullまたは...
-
JQuery selectが反映されない
-
html selectの内容を初期値に戻す
-
セレクトを全て選択されていな...
-
CSVファイルを読みこみ、プルダ...
-
jspに組込んだJavaScript でjava文
-
return trueとreturn falseの用...
-
hiddenのvalueの値を変えたい
-
出発駅A、到着駅Bを選択すると...
-
【jsp/Java】チェックボックス...
-
javascriptで質問です。 displa...
-
<JavaScript>tableタグを入力不...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
プルダウン 項目が多いので先頭...
-
Selectボックスの幅を自動で広...
-
セレクトを全て選択されていな...
-
jQuery セレクトボックスで選択...
-
Selectの中身をfor文で入れる
-
JQuery selectが反映されない
-
リストボックスの項目の順番を...
-
html selectの内容を初期値に戻す
-
ブラウザの戻るボタンを押した...
-
selectタグに直接onChangeを書...
-
テーブルにおける行(セルにプル...
-
現在時刻を取得してフォームのs...
-
セレクトの値を取得できない
-
【javascript・PHP】プルダウン...
-
onFocusOutが複数回呼ばれる!
-
document.form で nullまたは...
-
selectメニューのselectedの位...
-
CSVファイルを読みこみ、プルダ...
-
javascriptでの2つのプルダウン...
-
javascriptでselectボックスの<...
おすすめ情報