如何选择读/写时间和次数?

如何选择读/写时间和次数?

这个程序只等待一次,我不明白为什么。事实上,我认为这个问题不应该因为题外话而被搁置。

#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循环内部。

相关内容