리눅스 select함수 timeout관련

익명 사용자의 이미지

리눅스로 소켓프로그래밍을 하는데 select의 return값이 0이면 timeout을 출력하도록 했는데 출력이 안됩니다.

FD_ZERO(&reads);
FD_SET(sock1,&reads);
FD_SET(sock2,&reads);
fd_max=sock2;
while(1){

cpy_reads=reads;
timeout.tv_sec=5;
timeout.tv_usec=0;


fd_num=select(fd_max+1,&cpy_reads,0,0,&timeout);
if(fd_num==-1) {
error_handling("select() error\n");
}
else if (fd_num == 0) {//이부분이 잘 수행되지않습니다
printf("Timeout");
continue;
}
else{

//이부분은 잘 수행됨
FD_CLR(sock1, &cpy_reads);
FD_CLR(sock2, &cpy_reads);
}

무엇이 문제일까요

pynoos의 이미지

select 바로 밑에 fd_num을 출력해 보면 어떤 값이 나오나요..?

chanik의 이미지

timeout이 5초로 돼있는데 운영환경에서 5초이상 패킷이 안 들어오는 일이 없거나, 그게 아니라면 터미널과 유리된 데몬으로 동작한다든지 하는 이유로 printf("Timeout"); 출력이 버려지고 있는 것 아닐까요?

pynoos의 이미지

아, 이 답글을 보고 생각난 것은, 버퍼 때문인것 같으며, 뒤에 개행을 넣어 "Timeout\n" 으로 하면 바로 보이겠군요. ^^

아니면,

stdbuf -o0 ./a.out

강제로 버퍼를 끄고 실행해도 될 것 같네요.