如何循环选择()进行数据轮询循环往复(How to loop select() to poll fo

2019-09-17 08:54发布

#include <stdio.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>

int main ()
{
char            name[20];
fd_set          input_set;
struct timeval  timeout;
int             ready_for_reading = 0;
int             read_bytes = 0;

/* Empty the FD Set */
FD_ZERO(&input_set );
/* Listen to the input descriptor */
FD_SET(0, &input_set);

/* Waiting for some seconds */
timeout.tv_sec = 10;    // 10 seconds
timeout.tv_usec = 0;    // 0 milliseconds

/* Invitation for the user to write something */
printf("Enter Username: (in 15 seconds)\n");
printf("Time start now!!!\n");

/* Listening for input stream for any activity */
ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);
/* Here, first parameter is value of the socket descriptor + 1 (STDIN descriptor is 0, so  
 * 0 +1 = 1)  
 * in the set, second is our FD set for reading,
 * third is the FD set in which any write activity needs to updated, which is not required
 * in this case. Fourth is timeout
 */

if (ready_for_reading == -1) {
    /* Some error has occured in input */
    printf("Unable to read your input\n");
    return -1;
} else {
    if (ready_for_reading) {
        read_bytes = read(0, name, 19);
        printf("Read, %d bytes from input : %s \n", read_bytes, name);
    } else {
        printf(" 10 Seconds are over - no data input \n");
    }
}

return 0;

}

如何做同样的,但不只是一次,而是在无限循环,其遭遇后,打破了“退出”的字符串(例如)。 各方面我尝试 - 失败。 所以,如果没有数据有10秒钟的节目只是打印出“10秒超过 - 没有数据输入”之后被inputed后再次开始等待。 输入后一样的 - 只是又开始和行为的无限循环每次都相同。
是小已经绝望,请 - 帮助。
谢谢。

Answer 1:

我真的不看到这里的问题。 基本上只是把你想要的一切在循环,并让它运行。 你试试这个?

int main ()
{
   /* Declarations and stuff */
   /* ... */

   /* The loop */
   int break_condition = 0;
   while (!break_condition)
   {
       /* Selection */
       FD_ZERO(&input_set );   /* Empty the FD Set */
       FD_SET(0, &input_set);  /* Listen to the input descriptor */
       ready_for_reading = select(1, &input_set, NULL, NULL, &timeout);

       /* Selection handling */
       if (ready_for_reading)
       {
          /* Do something clever with the input */
       }
       else
       {
          /* Handle the error */
       }

       /* Test the breaking condition */
       break_condition = some_calculation();
   }
   return 0;
}

请注意,您必须有不断进行复位内循环选择,使其在下次迭代再次响应。



Answer 2:

的select()函数可以被告知通过设定超时为NULL无限期地阻塞。 请参阅选择(2)手册页:

超时是上界的时间之前的select()返回经过的量。 如果timeval中 stucture的两个领域是零,然后选择 ()立即返回。 (这是用于轮询是有用的。)如果超时是NULL(无超时), 选择 ()可以无限期地阻塞。

所以,你想要的是:

...
ready_for_reading = select(1, &input_set, NULL, NULL, NULL);
...


文章来源: How to loop select() to poll for data ad infinitum