select()

• I/O 멀티플렉싱 시스템 콜, 여러 개의 파일 디스크립터를 감시
• 어떤 디스크립터가 읽거나 쓰기 가능한 상태인지 확인하여 해당
디스크립터를 선택
• 이를 통해 단일 프로세스가 여러 개의 I/O 요청을 동시에 처리
• select() 함수가 호출되면, 블로킹 되어있다가 어떤 파일 디스크립터가 선택되면
반환
• select() 함수가 반환한 뒤, 선택된 파일 디스크립터에 대해 처리를 수행

코드

select, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O multiplexing
• /* According to POSIX.1-2001, POSIX.1-2008 */
• #include <sys/select.h>
• /* According to earlier standards */
• #include <sys/time.h>
• #include <sys/types.h>
• #include <unistd.h>
• int select(int nfds, fd_set *readfds, fd_set *writefds, // 감시하고자하는 파일디스크립터 개수, read를 감시하려는 파일디스크립터, 라이트, 익셉션 리턴, 타임아웃 지정, 무한정 기다리는게 아니라 시간초 지정
• fd_set *exceptfds, struct timeval *timeout);
  • 최대 1024개 감시 가능
  • poll(2) 사용
#include <sys/select.h>
int select(int numdes,
 fd_set *readmask,
 fd_set *writemask,
 fd_set *exceptmask,
 struct timeval *timeout);
numdes : 확인할 파일 디스크립터의 범위를 지정. 확인할 파일 디스크립터의 값 중 가장 큰 값 + 1
readmask : 읽기 가능한 상태를 확인할 파일 디스크립터의 집합
writemask : 쓰기 가능한 상태를 확인할 파일 디스크립터의 집합
exceptmask : 예외 상태를 확인할 파일 디스크립터의 집합
timeout : select 함수가 블록되는 시간을 설정. NULL이면 무한 대기
int n;
fd_set mask; 
FD_SET(n, &mask) /* set bit n */ // 감시하고자하는 파일디스크립터 지정 가능 , n이라는 파일디스크립터
FD_CLR(n, &mask) /* clear bit n */ // 클리어
result = FD_ISSET(n, &mask) /* test bit n */ 
FD_ZERO(&mask) /* clear all bits */
예) FD_SET(fileno(stdin), &readmask); // 입력에대한 파일 번호를 리턴받아서 그 비트를 세팅하겠다
fd_set rmask, mask;
FD_ZERO(&mask);
FD_SET(sock, &mask);
FD_SET(fileno(stdin), &mask);
for ( ; ; ) {
 rmask = mask;
 nfound = select(FD_SETSIZE, &rmask, (fd_set *)0, (fd_set *)0,
 &timeout);
 if (FD_ISSET(fileno(stdin), &rmask)) {
 fgets(buf, sizeof buf, stdin);
 }
 if (FD_ISSET(sock, &rmask)) {
 …
 }
 …
}

0개의 댓글