如何循环select()无限制地轮询数据

#include  #include  #include  #include  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秒结束 – 无数据输入”,然后再次开始等待。 输入后相同 – 再次开始,每次在无限循环中表现相同。
我已经很绝望了,拜托 – 求助。
谢谢。

我真的没有看到这里的问题。 基本上只是把你想要的东西放在循环中,让它运行。 你试过这个吗?

 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; } 

请注意,您必须不断重置循环内的选择,以便它在下一次迭代中再次响应。

可以通过将timeout设置为NULL来告知select()函数无限期地阻塞。 请参阅select(2)手册页:

timeoutselect ()返回之前经过的时间量的上限。 如果timeval结构的两个字段都为零,则select ()立即返回。 (这对轮询非常有用。)如果timeout为NULL(无超时),则select ()可以无限期地阻塞。

所以你想要的是:

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