这个程序只等待一次,我不明白为什么。事实上,我认为这个问题不应该因为题外话而被搁置。
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/select.h>
#include <unistd.h>
int main(void)
{
fd_set set;
struct timeval timeout;
int rv;
char buff[100];
int len = 100;
int filedesc = open( "/dev/ttyS0", O_RDWR );
int filedesc1 = filedesc + 1;
timeout.tv_sec = 5;
timeout.tv_usec = 10000;
while(1) {
printf("begin:\n");
FD_ZERO(&set); /* clear the set */
FD_SET(filedesc, &set); /* add our file descriptor to the set */
rv = select(filedesc1, &set, NULL, NULL, &timeout);
if(rv == -1)
perror("select\n"); /* an error accured */
else if(rv == 0)
printf("timeout\n"); /* a timeout occured */
else
read( filedesc, buff, len ); /* there was data to read */
}
}
答案1
从Select
联机帮助页:
在 Linux 上,select() 修改超时以反映未睡眠的时间量;大多数其他实现不会这样做。 (POSIX.1-2001 允许这两种行为。)
第一次超时发生后,您的timeout
变量已更新以反映剩余的睡眠时间,该时间为 0,因为它等待了整个 5.01 秒。
select
请注意如何未声明最后一个参数const
。
如果您希望它在后续时间再次等待 5.01s,您需要移动此代码:
timeout.tv_sec = 5;
timeout.tv_usec = 10000;
...在while
循环内部。