Как выбрать время чтения и записи?

Эта программа только ждет один раз, и я не понимаю, почему. На самом деле, я не думаю, что этот вопрос должен быть приостановлен как не по теме.

#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 */ } } 

  • Могу ли я изменить способ отображения параметров выбора?
  • Использование команды `select` для печати меню в Linux
  • Создание списка меню и выполнение задачи
  • Меню выбора сценария bash
  • One Solution collect form web for “Как выбрать время чтения и записи?”

    На странице Select man:

    В Linux select () изменяет таймаут, чтобы отразить количество времени, которое не спал; большинство других реализаций этого не делают. (POSIX.1-2001 допускает либо поведение.)

    После первого таймаута ваша переменная timeout была обновлена, чтобы отобразить оставшееся до сна время, которое равно 0, потому что оно ожидало все 5.01s.

    Обратите внимание, как последний аргумент для select не объявляется const .

    Если вы хотите, чтобы он снова ожидал 5.01s в последующие моменты времени, вам нужно переместить этот код:

     timeout.tv_sec = 5; timeout.tv_usec = 10000; 

    … внутри цикла while.

    Linux и Unix - лучшая ОС в мире.