os별 select

lsh235·2024년 10월 6일
0

c++

목록 보기
2/4

windows select

int WSAAPI select(
  [in]      int           nfds,
  [in, out] fd_set        *readfds,
  [in, out] fd_set        *writefds,
  [in, out] fd_set        *exceptfds,
  [in]      const timeval *timeout
);

linux select

int select (int nfds,
			fd_set *read-fds,
			fd_set *write-fds,
            fd_set *except-fds,
            struct timeval *timeout)

기본적으로 구조는 같다.
nfds는 "number of file descriptors"의 약자로, select가 감시할 가장 큰 파일 디스크립터 번호 + 1을 의미합니다.

리눅스에서는

nfds는 select가 검사할 파일 디스크립터들의 집합에서 가장 큰 파일 디스크립터 번호보다 하나 큰 값입니다. 이 값이 필요한 이유는 select가 내부적으로 fd_set을 순차적으로 확인하면서 파일 디스크립터를 확인하기 때문에, 루프의 종료 조건을 제공하는 데 사용됩니다.

예를 들어, fd_set에 5, 8, 10번의 파일 디스크립터를 설정했다면, nfds는 가장 큰 파일 디스크립터인 10에 1을 더한 11이 되어야 합니다.

윈도우즈에서는

nfds가 실제 파일 디스크립터 수나 최대 값과 관련이 없습니다. 윈도우에서는 fd_set 구조체에 있는 소켓의 개수만 신경 쓰므로, nfds는 설정해도 무시됩니다.


따라서

linux에서는 select를 사용 할 경우
select(max_fd + 1, ~~~)

windows에서는 select를 사용 할 경우
select(0, ~~~)

으로 사용해도 무관하다.


부가 설명

이러한 이유는 파일 디스크립터와 소켓 핸들 차이에 있습니다.
리눅스에서는 파일 디스크립터를 사용하여 파일, 소켓, 파이프 등의 다양한 입축력 리소스가 관리되기때문입니다. 반면, 윈도우즈는 소켓 핸들과 일반 파일 디스크립터가 분리되어 있기 때문에, select는 오직 소켓에만 적용됩니다.

0개의 댓글