Como selecionar o tempo de leitura / gravação e novamente? [fechadas]

0

Este programa só aguarda uma vez e eu não entendo o porquê. Na verdade, eu não acho que essa questão deva ser colocada como fora do tópico.

#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 */
  }
}
    
por kangear 01.02.2015 / 05:17

1 resposta

4

Na% man_de% manpage:

On Linux, select() modifies timeout to reflect the amount of time not slept; most other implementations do not do this. (POSIX.1-2001 permits either behavior.)

Após o primeiro tempo limite, a variável Select foi atualizada para refletir a quantidade de tempo restante para suspensão, que é 0, porque esperou por todos os 5.01s.

Observe como o último argumento para timeout não está declarado select .

Se você quer que ele espere 5.01s novamente nos tempos subseqüentes, você precisa mover este código:

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

... dentro do loop const .

    
por 01.02.2015 / 05:37

Tags