2010-12-30 2 views
5

유닉스에서 select 함수를 사용할 때 문제가 있습니다.선택 시스템 호출간에 fd_set을 재설정해야합니까?

나는 연결을 기다리는 서버가 있습니다. 먼저 수신 대기 소켓 파일 디스크립터 listenerFD_SET(listener, readfds)을 사용하여 fd_set readfds에 추가 한 다음 select()에 사용합니다.

연결할 때 accept()을 호출하고 허용 된 파일 설명자를 사용하여 readfds을 선택하여 연결 데이터를 수신하기 시작합니다. 그러나 strace의 코드를 검사 할 때 readfds에 선택 항목에 리스너가 표시되지 않으며 select()이 두 번 실행됩니다.

FD_SET(listener, readfds)을 사용하여 수신기 파일 설명자를 다시 설정해야 select()을 다시 호출해야합니까?

감사합니다.

+0

또한 Linux에서는 시간 초과 값을 수정할 수 있으므로 다시 초기화해야합니다. 표준은 이것을 허락하지만 유닉스의 다른 풍미에서는 드물다. –

답변

10

예 (select() 시스템 호출 사이에서 fd_set을 재설정해야합니다.)

불편하지만 입력/출력 매개 변수로 사용됩니다. 시스템 호출에 의해 읽혀지고 수정됩니다. select()이 반환되면 값은 모두 준비된 파일 설명자를 반영하도록 수정됩니다. 따라서 select()으로 전화하기 전에 항상 fd_set 값을 초기화해야합니다.

+0

나는 당신의 대답을 분명히 알지 못했다. 그것은 선택 반환 후 listenfd (내가 동의하는)는 select에서 데이터를 수신하기 위해 찾고있는 read fd_set에서 리셋됩니다. – sandeep

+0

고마워요 조나단 .. 지금은 분명해. – sandeep

1

조나단이 맞습니다.

set readFDs 
set writeFDs 
set errorFDs 
select(count_of_FDs, readFDs, writeFDs, errorFDs, timeout) 
관련 문제