이 프로그램은 한 번만 대기하는데 그 이유를 모르겠습니다. 사실 이 질문은 주제에서 벗어난 질문으로 남겨둬서는 안 된다고 생각합니다.
#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
남은 절전 시간을 반영하도록 변수가 업데이트되었습니다. 이는 전체 5.01초를 대기했기 때문에 0입니다.
select
마지막 매개변수가 어떻게 선언되지 않았는지 확인하세요 const
.
이후에 5.01초 동안 다시 대기하려면 다음 코드를 이동해야 합니다.
timeout.tv_sec = 5;
timeout.tv_usec = 10000;
... while
루프 내부.