gpt4 book ai didi

c - 如何循环 select() 以无限轮询数据

转载 作者:太空狗 更新时间:2023-10-29 15:04:35 25 4
gpt4 key购买 nike

#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 秒结束 - 没有数据输入”,然后再次开始等待。输入后相同 - 再次开始并在无限循环中每次都表现相同。
我已经有点绝望了,请帮忙。
谢谢。

最佳答案

我真的看不出这里有什么问题。基本上只是把你想要的一切都放在循环中,然后让它运行。你试过这个吗?

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

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

关于c - 如何循环 select() 以无限轮询数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10665614/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com