1
select()를 사용하여 실험하는 동안 이상한 결과가 나타납니다.select가 무한정 기다리는 중임
fd_set tempset,set; //set of descriptors
FD_ZERO(&set); //initialize descriptor set to NULL
FD_SET(serversock,&set); //add server's socket to descriptor set 'set'
timeout.tv_sec=2;
timeout.tv_usec=0;
while(1){
tempset=set;
timeout.tv_sec=2;
timeout.tv_usec=0;
printf("%s","Waiting on select\n");
int ret=select(FD_SETSIZE,&tempset,NULL,NULL,&timeout);
if(ret==0) printf("timeout ");
else if(ret==-1){
printf("Error occured\n");
exit(0);
}
else if(ret>0){ //socket ready for reading
for(i=0;i<FD_SETSIZE;i++){
if(FD_ISSET(i,&tempset)){ //check if it's serversock
if(i==serversock){
//accept connection and read/write
printf("Client connected\n");
}//i==serversock close
}
}//for ends
}
printf ("% s", "Waiting on select \ n"); select는 무한정 대기합니다. 그러나 라인을 다시 삽입하면 모든 것이 예상대로 작동합니다 (클라이언트 연결로 테스트 됨)
내가 놓친 것이 있습니까?
미리 감사드립니다.
당신은이 루프에서 선택한 각 호출하기 전에 설정 파일 설명을 다시 초기화해야합니다. –
stdio 버퍼링 효과가있을 수 있습니다. "timeout"메시지, 즉'printf ("timeout \ n");'에 줄 바꿈을 추가하고 관찰 내용을 변경하는지 확인하십시오. 'select()'는 실제로 2 초마다 시간을 초과하지만 실제로는'printf'가'stdout' 라인 버퍼를 내 보내지 않으면 그것을 볼 수 없을 것입니다. – Celada
예, 시간 초과 후 새 행을 추가하면 트릭을 수행합니다. 감사! select가 작동하려면 stdout을 플러시해야하는 이유는 무엇입니까? – Karan