헤더
#include <sys/types.h>
#include <sys/event.h>
#include <sys/time.h>
kqueue 생성
int kqueue();
새로운 Kernel event queue를 생성하고 해당 FD를 반환한다.
생성된 queue는 fork 된 자식이 상속할 수 없지만, RFFDG 플레그를 사용하지 않은 rfork사용 시 fd table을 공유할 수 있다.
반환 값 : -1은 실패, 이외의 값은 fd이다.
event 관리
int kevent(int kq
, const struct kevent *changelist, int nchanges
, struct kevent *eventlist, int nevents
, const struct timespec *timeout)
반환 값 : -1은 실패, 0은 Timeout, 이외의 값은 현재 발생한 Event의 수이다.
인자
- kq : kqueue로 생성된 kqueue의 fd
- changelist : 추가 혹은 수정이 필요한 이벤트의 리스트이다.
(나는 이 매개 변수가 많이 헷갈렸다.) 한 번 풀어서 쓴다면, 추가하거나 변경사항이 있는 이벤트는 여기에 추가된다. 하지만 한 번에 내가 정한 최대의 이벤트의 개수만 확인하여 처리한다. 이후 처리한 이벤트는 큐에 다시 쌓이게 되고 해당하는 큐는 처리하지 못한 이벤트가 가장 앞으로 나오게 되어 다음번에 처리할 수 있도록 해준다. - nchanges : 한 번에 변경, 추가할 이벤트의 수
- eventlist : 이벤트를 받으면 커널에서 이벤트를 넣어주는 배열(발생한 이벤트의 정보를 넣어준다.)
- nevents : 한 번에 처리할 수 있는 이벤트의 수
- timeout : timeout값(NULL일 땐 무한정 대기한다.)
큐에 이벤트를 등록, 처리되지 않은 이벤트들을 사용자에게 반환하고자 할 때 사용한다. 큐에 이벤트들을 등록하는 것은 chagelist, 이벤트가 발생했을 때는 eventlist에 정보가 담긴다.
즉, changelist는 변경사항이 발생했을 때, 추가되고 kevent를 실행한 뒤 초기화시켜야 한다.(nchanges = 0) 또한, eventlist도 초기화될 것이다.
kevent 구조체
struct kevent
{
uintptr_t ident;
short filter;
u_short flags;
u_int fflags;
intptr_t data;
void *udata;
}
인자
- ident : 해당 kevnet에 대한 fd
- filter : 이벤트 필터 플래그
- flags : kqueue에 대한 액션 플래그
- fflags : 필터 플래그 값
- data : 필터 데이터 값
- udata : 사용자 정의 데이터
이벤트 추가, 변경 시에 사용할 매크로
EV_SET(&kev, ident, filter, flags, fflags, data, udata)
flags
- EV_ADD : 이벤트 추가
- EV_ENABLE : kqueue에서 이벤트를 활성화
- EV_DISABLE : kqueue에서 이벤트를 비활성화
- EV_DELETE : kqueue에서 이벤트 삭제
- EV_ONESHOT : kqueue에서 설정된 이벤트를 단 한 번만 알려준다.
- EV_CLEAR : 이벤트 reset
- EV_EOF : EOF상태를 인식할 수 있다.
- EV_ERROR : 에러
fflags
- EVFILT_READ : 읽기 액션
- EVFILT_WRITE : 쓰기 액션
- EVFILT_EMPTY : 버퍼가 비어있을 때 발생하는 액션
- EVFILT_AIO : AIO 요청
- EVFILT_VNODE : fflag에서 감시 중인 이벤트 중 하나 이상이 발생할 때 발생하는 액션
- EVFILT_PROC : 프로세스 id에서 이벤트를 감시
- EVFILT_SIGNAL : 감시하는 시그널이 프로세스에 전달될 때 발생하는 액션
'42일기' 카테고리의 다른 글
inception (0) | 2022.10.24 |
---|---|
I/O Multiplexing (0) | 2022.07.23 |
ft_containers[Red-Black Tree] (1) | 2022.04.29 |
ft_containers[Map] (0) | 2022.04.26 |
CPP [템플릿] (0) | 2022.03.02 |