728x90
- 검사(관찰)의 범위지정과 타임아웃의 설정
- select함수
- #include <sys/select.h>
- #include <sys/time.h>
- int select(
- int maxfd, fd_set *readset, fd_set *writeset, fd_set *exceptset, const struct timeval *timeout);
- -> 성공시 0 이상 실패시 -1 반환
- maxfd : 검사 대상이되는 파일 디스크립터의 수
- readset : fd_set형 변수에 "수신된 데이터의 존재여부"에 관심 있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소 값을 전달한다 .
- writeset : fd_set형 변수에 "블로킹 없는 데이터 전송의 가능여부"에 관심있는 파일 디스크립터 정보를 모두 등록해서 그 변수의 주소값을 전달한다.
- exceptset : fd_set형 변수에 " 예외상황의 발생여부" 에 관심이 있는 파일 디스크립터 정보를 모두 등록해서 그변수의 주소 값을 전달한다.
- timeout: select 함수호출 이후에 무한정 블로킹 상태에빠지지 않도록 타임아웃(time-out)을 설정하기 위한인자를 전달한다.
- 반환 값 : 오류 발생시에는 -1이 반환되고 타임 아웃에 의한 반환 시에는 0이 반환된다. 그리고 관심대상으로 등록된 파일ᅟᅳ크립터에 해당 관심에 관련된 변화가 발생하면 0 보다 큰 값이 반환되는데 이값은 변화가 발생한 파일 디스크립터의 수를 의미한다.
- select함수는 세가지 관찰항목의 변화를 확인하는데 사용된다고 하지 않았는가? 바로 이 세 가지 관찰항목별로 fd_set형 변수를 선언해서 파일 디스크립터 정보를 등록하고 이 변수의 주소 값을 위함수의 두번째 세 번째그고 네 번째 인자로 전달하게된다. 그런데이에서(select함수의 호출에 앞서)다음 두가지를 먼저 결정해야한다.
- "파일 디스크립터의 관찰(검사)범위는 어떻게 되지?"
- "select함수의 타임아웃 시간을 어떻게 할까?"
- 이중 첫번째 파일 디스크립터의 관찰(검사) 범위는select함수의 첫 번째매개변수와 관련이 있다. 사실 select함수는 관찰의대상이 되는 파일 디스크립터의 수를 첫번째 인자로 요구하고 있다. 따라서 fd_set형 변수에 등록된파일 디스크립터의 수를 확인할 필요가 ᄊᅠ는데파일 디스크립터의값은 생성될때마다 1씩 증가하기 때문에 가장 큰파일 디스크립터의에 1을 더해서 인자로 전달하면 된다. 1을 더하는이유는 파일 디스크립터의값이 0에서부터 시작하기 때문이다. 그리고 두번째 select함수의 타임아웃시간은 select함수의 마지막 매개변수와관련이있는데 매개변수선언에서 보이는 자료형 timeval은 구조체 기반의자료형으로다음과 같이 정의되어이싿.
- struct timeval
- {
- long tv_sec; // seconds
- long tv_usec; // microseconds
- }
- 원래 select함수는 관찰중인 파일 디스크립터에 변화가 생겨야 반환을 한다. 때문에 변화가 생기지 않으면 무한정 블로킹 상태에 머물게 된다. 바로이러한 상황을 막기 위해서 타임아웃을 지정하는 것이다. 위 구조체 변수를 선언해서 멤버 tv_sec에 초 단위 정보를 멤버 tv_usec에 마이크로 초 단위 정보를 지정하고 이 변수의 주소값을 select함수의 마지막 인자로 전달을 하면 파일 디스크립터에 변화가 발생하지 않아도 지정된 시간이 지나면 함수가 반환을 한다. 단! 이렇게 해서 반환이 되는경우 select함수는 0을 반환한다. 때문에 반환값을 통해서 반환의 원인을 알 수 있다. 그리고 타임아웃을 설정하고 싶지않을 경우에는 NULL을 인자로 전달하면 된다.
- select 함수호출 이후의 결과확인
- 예제를 통해서 보이지는 않았지만그림 12-5의 step one에 해당하는 select함수호출 이전의 작업에 대해 모두 설명하였다. 그리고 select함수에 대해서도 설명하여싿. 그러나 이에 못지않게 중요한 것이 함수호출의 결과를 확인하는 방법이다. select함수의반환 값에 대해서는위에서한번 정리하였다. 0이 아닌 양수가 반환되면 그수만큼 파일 디스크립터에 변화가 발생했음을 의미한다.
- 참고 : [ 파일 디스크립터의 변화 ]
- 여기서 말하는 파일 디스크립터의변화는 관심대상으로 등록된 파일 디스크립터에 해당 관심에 관련된 변화가 발생했음을 뜻한다. 즉 select함수의 두 번쨰 인자를통해서 "데이터 수신여부"의 관찰대상에 포함된 파일 디스크립터로수신된 데이터가 존재하는 경우가 파일 디스크립터에변화가 발생한 경우이다.
- 그렇다면 select함수가 양의 ㅇ수를 반환한 경우 변화가 발생한 파일 스크립터는 어떻게 알아낼 수 ㅆ을까? select함수의 두번째 세번째그리고네번째인자로 전달된 fd_set형 변수에다음그림에서 보이는 변화가 발생하기 때문에 어렵지 않게 알아낼 수 있다.
- 위 그림에서 보이듯이 select함수호출 완료되고 나면 select함수의 인자로 전달된 fd_set형 변수에는 변화 생긴다. 1로 설정된 모든 비트가다 0으로 변경되지만 변화가 발생한 ㅏ일 디스크립터에 해당하는 비트만 그대로 1로 남아있게된다. 때문에 여전히 1로 남아있는 위치의 파일 디스크립터에서 변화가 발생했다고 판단할 수 있다.
728x90
'책 > 윤성우 TCPIP' 카테고리의 다른 글
12-02 select 함수의이해와 서버의 구현 (2) (0) | 2020.12.30 |
---|---|
12-02 select 함수의이해와 서버의 구현 (0) | 2020.12.29 |
12 IO 멀티플렉싱(Multiplexing) (0) | 2020.12.27 |
11-01 프로세스간 통신의 기본 개념 (3) ~ 11-02 프로세스간 통신의 적용 (0) | 2020.12.26 |
11-01 프로세스간 통신의 기본 개념 (2) (0) | 2020.12.25 |