이 름
select, FD_CLR, FD_ISSET, FD_SET, FD_ZERO − 동 기 적 I/O 다 중 화
사 용 법
#include
<sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int select(int n, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, struct timeval *timeout);
FD_CLR(int
fd, fd_set *set);
FD_ISSET(int fd, fd_set *set);
FD_SET(int fd, fd_set *set);
FD_ZERO(fd_set *set);
설 명
select 는 상 태 가 변 경 되 는 파 일 기 술 자 들 의 숫 자 를 기 다 린 다 .
세 개 의 독 립 적 인 파 일 기 술 자 집 합 들 을 검 사 한 다 . readfds 에 리 스 트 된 것 들 은 문 자 들 을 읽 어 들 일 수 있 는 가 가 검 사 되 며 (더 정 확 히 는 , 읽 기 가 봉 쇄 되 지 않 았 는 지 를 검 사 하 기 위 해 서 이 다 - 특 별 히 , 파 일 기 술 자 또 한 end-of-file 일 수 도 있 다 .), writefds 에 있 는 것 들 은 쓰 기 가 봉 쇄 되 지 않 았 는 가 가 검 사 되 며 exceptfds 에 있 는 것 들 은 예 외 가 있 는 지 가 검 사 된 다 . 종 료 시 , 이 집 합 들 은 파 일 기 술 자 들 이 실 제 로 변 경 된 상 태 가 무 엇 인 지 가 리 키 도 록 수 정 된 다 .
네 개 의 매 크 로 가 이 집 합 들 을 제 어 하 기 위 해 사 용 된 다 . FD_ZERO 는 집 합 을 소 거 한 다 . FD_SET 와 FD_CLR 는 집 합 에 서 주 어 진 기 술 자 를 더 하 거 나 뺀 다 . FD_ISSET 는 기 술 자 가 집 합 의 일 부 분 인 지 아 닌 지 를 검 사 한 다 .: 이 것 은 select 가 반 환 된 후 유 용 하 다 .
n 은 세 개 의 집 합 중 가 장 높 은 파 일 기 술 자 에 다 가 1을 더 한 다 .
timeout 은 select 가 반 환 하 기 전 에 경 과 해 야 하 는 시 간 의 상 위 제 한 값 이 다 . 0으 로 지 정 되 면 select 는 즉 시 반 환 된 다 . 만 일 timeout 이 NULL이 면 (timeout이 없 을 경 우 ), select 는 무 한 히 봉 쇄 될 수 있 다 .
반 환 값
성 공 시 , select 는 파 일 기 술 자 집 합 에 포 함 된 기 술 자 들 의 숫 자 를 반 환 하 며 , 어 떠 한 일 이 일 어 나 기 전 에 타 임 아 웃 이 발 생 하 면 0을 반 환 한 다 . 에 러 시 , −1이 반 환 되 며 , errno 는 적 당 한 값 으 로 설 정 된 다 .; 집 합 들 과 timeout 은 정 의 가 안 되 며 , 그 래 서 에 러 후 이 것 들 의 내 용 에 의 지 할 수 없 다 .
에 러
EBADF |
유 효 하 지 않 은 파 일 기 술 자 가 집 합 중 하 나 에 들 어 있 다 . | ||
EINTR |
비 -블 럭 된 신 호 가 잡 혔 다 . | ||
EINVAL |
n 이 음 수 이 다 . | ||
ENOMEM |
select 가 내 부 테 이 블 들 을 위 한 메 모 리 를 할 당 할 수 없 다 . |
주 의
몇 몇 코 드 들 은 정 확 성 을 가 지 고 잠 복 시 키 기 위 해 꽤 호 환 되 는 방 법 으 로 써 세 개 의 집 합 을 비 우 고 , n 은 0, 그 리 고 timeout 은 null이 아 니 게 설 정 하 여 select 를 호 출 한 다 .
리 눅 스 에 서 , timeout 은 잠 복 되 지 않 은 시 간 의 양 을 반 영 하 기 위 해 수 정 된 다 ; 대 부 분 의 다 른 수 행 들 은 이 렇 게 되 지 않 는 다 . 이 것 은 timeout 을 읽 은 리 눅 스 코 드 들 이 다 른 OS로 포 팅 되 거 나 코 드 들 이 초 기 화 를 다 시 하 지 않 고 반 복 문 에 서 다 중 selects 를 위 해 timeval 구 조 체 를 다 시 사 용 하 여 리 눅 스 로 포 팅 할 때 문 제 들 을 야 기 한 다 . select 에 서 반 환 된 후 정 의 되 지 않 은 timeout 을 고 려 해 야 한 다 .
예 제
#include
<stdio.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
int
main(void)
{
fd_set rfds;
struct timeval tv;
int retval;
/* 입
력 된 때 를 알 아
보 기 위 해 stdin (fd 0)을
검 사 한 다 . */
FD_ZERO(&rfds);
FD_SET(0, &rfds);
/* 5초 를 기 다 린 다 .
*/
tv.tv_sec = 5;
tv.tv_usec = 0;
retval =
select(1, &rfds, NULL, NULL, &tv);
/* 지 금 tv 값 에 의 존
하 지 마 라 . */
if (retval)
printf("Data is available now.\n");
/* FD_ISSET(0, &rfds) 는 true이 다 .
*/
else
printf("No data within five seconds.\n");
exit(0);
}
호 환
4.4BSD ( select 함 수 는 4.2BSD에 서 처 음 나 타 났 다 .). 일 반 적 으 로 BSD 소 켓 층 (System V 변 종 들 을 포 함 하 여 )의 복 사 판 들 을 지 원 하 는 non-BSD계 열 과 호 환 된 다 . 그 러 나 , System V 변 종 들 은 전 형 적 으 로 종 료 전 에 timeout 변 수 를 설 정 하 지 만 , BSD 변 종 들 은 그 렇 게 하 지 않 는 다 는 것 을 주 의 해 라 .
관 련 항 목
accept(2), connect(2), poll(2), read(2), recv(2), send(2), write(2)
역 자
정 강 훈 <skyeyes [AT] soback.net>, 2000년 7월 1일