컴퓨터 공부/Advanced UNIX System Programming

[5월 8일 1교시] 입출력 다중화 1

려리군 2009. 5. 8. 10:14

다수의 blocking file descriptor를 번갈아가며 처리 불가.

해결책

 - 모든 디스크립터를 nonblocking으로 설정한 뒤 전부 검사(polling)

 - 비동기 입출력을 선택적으로 결합

 - 입출력 다중화 함수를 사용 - select, poll함수


select함수

#include<sys/types.h>

#include<sys/time.h>

#include<unistd.h>


int select(__in int maxfdp1,__inout fd_set *readfds,__inout fd_set *writefds, __inout fdset *exceptfds,_in struct timeval *tvptr);

입출력 및 urgent bit를 감지하여 호출 성공시 준비된 디스크립터를 알려준다.


maxfdp1 : fd의 최대값의 1을 더한다.

readfds

-before(in) : 읽기를 감지하고자 하는 파일 디스크립터 비트배열.

-after(out) : 읽을 준비가 된 파일 디스크립터 비트배열.

writefds : 쓰기를 감지

exceptfds : urgent bit를 감지.

timeval : NULL이면 blocking모드, 0이면 nonblocking, 0이상이면 timeout후 검사.

리턴 : 준비된 파일 디스크립터 수. -1이면 오류


FD_ZERO(fd_set *fdset);

FD_SET/CLR/ISSET(int fd, fd_set *fdset);


struct timeval{

        long tv_sec;    // 초

        long tv_usec;  // 마이크로초

};