2
   /* Wait up to 1 min */
   tv.tv_sec = 60;
   tv.tv_usec = 0;

   FD_ZERO(&readfd);
   FD_ZERO(&writefd);
   for(i=0;i<3;i++)
   {
     FD_SET(my_rdfd[i], &readfd);
     FD_SET(my_wrfd[i], &writefd);
   }

   for(int i=0;i<10;i++)
   {
     retval = select((NRFDS)+1, &readfd, &writefd, (fd_set*)0, &tv);//NRFDS is a macro

     if (retval == -1)
       printf("select() error");
     else if (retval)
     {
       printf("data found\n");
       //do something with the data recieved
     }
     else
       printf("Timeout.\n");
   }

問題は、for ループ内の select() が初めて期待どおりに機能することです。その後のループでは機能しません。私は何を間違っていますか?

ご協力ありがとうございました。

4

1 に答える 1

3

これを for ループ内に入れてみてください:

for(i=0;i<10;i++)
{
  tv.tv_sec = 60;
   tv.tv_usec = 0;

   FD_ZERO(&readfd);
   FD_ZERO(&writefd);
   for(j=0;j<3;j++)
   {
     FD_SET(my_rdfd[j], &readfd);
     FD_SET(my_wrfd[j], &writefd);//Note that you should use a different inside forloop
   }

   //select statement here

}

戻るとselect()、セットを変更して、どのファイル記述子が読み取り/書き込み/例外の準備ができているかを示します。他のすべてのフラグはクリアされます。

別の選択を開始する前に、クリアされたファイル記述子を再度有効にすることが重要です。そうしないと、それらのファイル記述子を待機しなくなります。

于 2012-10-20T11:21:13.507 に答える