헤더

#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

+ Recent posts