1
select()を試している間に奇妙な結果が出てきます。selectは無期限に待機し続けます
fd_set tempset,set; //set of descriptors
FD_ZERO(&set); //initialize descriptor set to NULL
FD_SET(serversock,&set); //add server's socket to descriptor set 'set'
timeout.tv_sec=2;
timeout.tv_usec=0;
while(1){
tempset=set;
timeout.tv_sec=2;
timeout.tv_usec=0;
printf("%s","Waiting on select\n");
int ret=select(FD_SETSIZE,&tempset,NULL,NULL,&timeout);
if(ret==0) printf("timeout ");
else if(ret==-1){
printf("Error occured\n");
exit(0);
}
else if(ret>0){ //socket ready for reading
for(i=0;i<FD_SETSIZE;i++){
if(FD_ISSET(i,&tempset)){ //check if it's serversock
if(i==serversock){
//accept connection and read/write
printf("Client connected\n");
}//i==serversock close
}
}//for ends
}
私はprintf( "%s"、 "Waiting on select \ n")行を削除します。選択は無期限に待機し続けます。しかし、私がラインを再挿入すると、すべてが正常に動作します(クライアント接続でテストされます)
私に何か不足していますか?
ありがとうございます!
あなたはこのループで選択するために各呼び出し前に設定ファイルディスクリプタを再初期化する必要があります。 –
stdioバッファリングの効果があるかもしれません。 "timeout"メッセージに改行を追加してください( 'printf(" timeout \ n ");')。あなたの 'select()'は実際には2秒ごとにタイムアウトしていますが、 'stdout'行バッファーをフラッシュする' printf'がなければ見えません。 – Celada
はい、タイムアウト後に新しい行を追加すると、そのトリックが実行されます。ありがとう! しかし、selectを動作させるためにstdoutをフラッシュする必要があるのはなぜですか? – Karan