다수의 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; // 마이크로초
};
'컴퓨터 공부 > Advanced UNIX System Programming' 카테고리의 다른 글
[5월 8일 3교시] IPC (0) | 2009.05.08 |
---|---|
[5월 8일 2교시] 입출력 (0) | 2009.05.08 |
[5월 7일 3교시] 시그널 2 (0) | 2009.05.07 |
[5월 7일 2교시] 시그널 1 (0) | 2009.05.07 |
[5월 7일 1교시] 프로세스 관계 + 데몬 프로세스 (0) | 2009.05.07 |