epoll 설정하기
epoll 집합을 만들고 등록해 보세요.
epoll 설정하기은(는) CoddyKit의 무료 C Academy 강의입니다. 이것은 4개 중 2번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 C Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
epoll 인스턴스 생성
모든 작업은 그 자체가 파일 디스크립터인 epoll 인스턴스에서 시작합니다. epoll_create1()로 생성합니다.
인수는 플래그 필드입니다. 기본 동작에는 0을 전달하고, exec()를 거칠 때 디스크립터를 자동으로 닫으려면 EPOLL_CLOEXEC을 전달합니다. 반환된 fd를 다른 모든 epoll 호출에 전달합니다.
int epfd = epoll_create1(EPOLL_CLOEXEC);
if (epfd == -1) { perror("epoll_create1"); exit(1); }epoll_create1과 epoll_create
이전 방식의 epoll_create(int size)는 크기 힌트를 받았지만, 이제 커널은 이를 무시합니다. 유일한 요구 사항은 값이 양수여야 한다는 것이었습니다.
epoll_create1()을 사용하는 편이 좋습니다. 의미 없는 크기 대신 플래그를 받고, EPOLL_CLOEXEC을 원자적으로 요청할 수 있어 별도의 fcntl() 호출을 피할 수 있습니다.
/* legacy form, size arg ignored by kernel */
int epfd = epoll_create(1);epoll_event 구조체
관심 이벤트와 결과는 모두 struct epoll_event를 통해 표현합니다. 여기에는 events 비트 마스크와 data 공용체가 있습니다.
data 공용체에는 이벤트가 발생했을 때 반환할 값을 원하는 대로 담을 수 있습니다. 일반적으로 data.fd를 사용하지만, 직접 할당한 연결 객체를 가리키는 data.ptr을 사용할 수도 있습니다.
struct epoll_event ev;
ev.events = EPOLLIN;
ev.data.fd = listen_fd;EPOLL_CTL_ADD로 등록하기
epoll_ctl()은 관심 목록을 관리합니다. 디스크립터 감시를 시작하려면 EPOLL_CTL_ADD 연산을 사용합니다.
epoll fd, 연산, 대상 fd, 그리고 epoll_event를 가리키는 포인터를 전달합니다. 그러면 epoll이 해당 디스크립터의 준비 상태를 보고합니다.
struct epoll_event ev = { .events = EPOLLIN, .data.fd = listen_fd };
if (epoll_ctl(epfd, EPOLL_CTL_ADD, listen_fd, &ev) == -1)
perror("epoll_ctl: add");이벤트 플래그: EPOLLIN과 EPOLLOUT
events 마스크는 어떤 상태에 관심이 있는지를 나타냅니다. EPOLLIN은 디스크립터를 읽을 수 있음을, EPOLLOUT은 쓸 수 있음을 의미합니다.
일반적으로 수신 대기 소켓에서는 연결을 수락하기 위해, 클라이언트 소켓에서는 읽기 위해 EPOLLIN을 감시합니다. 버퍼에 완전히 전송되지 않은 데이터가 있을 때만 EPOLLOUT을 추가합니다.
ev.events = EPOLLIN | EPOLLOUT;오류 및 연결 끊김 플래그
커널은 요청하지 않았더라도 특정 상태를 항상 보고합니다. EPOLLERR은 오류, EPOLLHUP은 연결 끊김, EPOLLRDHUP은 피어의 반쪽 닫기를 나타냅니다.
처리기에서 이러한 상태를 확인해야 합니다. 끊어진 소켓의 EPOLLHUP을 무시하면 이벤트 루프가 계속 반복되는 문제가 발생합니다.
if (ev.events & (EPOLLERR | EPOLLHUP)) {
close(ev.data.fd);
continue;
}EPOLL_CTL_MOD로 관심 이벤트 수정하기
디스크립터를 등록한 뒤에도 삭제하지 않고 이벤트 마스크를 변경할 수 있습니다. EPOLL_CTL_MOD를 사용합니다.
일반적인 방식은 다음과 같습니다. 연결은 보통 EPOLLIN만 감시하다가 전송 버퍼가 가득 차면 EPOLLIN | EPOLLOUT으로 전환하고, 버퍼를 모두 비우면 다시 원래대로 전환합니다.
ev.events = EPOLLIN | EPOLLOUT;
ev.data.fd = conn_fd;
epoll_ctl(epfd, EPOLL_CTL_MOD, conn_fd, &ev);EPOLL_CTL_DEL로 제거하기
연결이 닫히면 EPOLL_CTL_DEL로 해당 연결의 감시를 중지합니다. 마지막 epoll_event 인수는 무시되며 최신 커널에서는 NULL이어도 됩니다.
디스크립터를 닫으면 모든 epoll 관심 목록에서 자동으로 제거됩니다. 그래도 닫기 전에 명시적으로 삭제하면 상태 관리를 명확하게 유지할 수 있습니다.
epoll_ctl(epfd, EPOLL_CTL_DEL, conn_fd, NULL);
close(conn_fd);수준 트리거 방식과 에지 트리거 방식
기본적으로 epoll은 수준 트리거 방식입니다. 디스크립터를 계속 읽을 수 있는 동안 모든 epoll_wait() 호출이 이를 보고합니다. 이 방식은 여유롭고 사용하기 쉽습니다.
에지 트리거 방식에는 EPOLLET 플래그를 추가합니다. 준비 상태가 변경될 때만 알림을 받으므로, EAGAIN이 반환될 때까지 반복해서 소켓의 데이터를 모두 읽어야 합니다.
ev.events = EPOLLIN | EPOLLET; /* edge-triggered */
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);컨텍스트 포인터 저장하기
data.fd 대신 연결별 구조체를 가리키는 data.ptr을 저장할 수 있습니다. 이벤트가 발생하면 조회 테이블 없이 해당 포인터를 직접 돌려받습니다.
다만 이 공용체의 특성을 기억해야 합니다. data.ptr을 설정했다면 같은 이벤트에서 data.fd도 읽을 수 없습니다.
struct conn *c = malloc(sizeof *c);
c->fd = conn_fd;
ev.events = EPOLLIN;
ev.data.ptr = c;
epoll_ctl(epfd, EPOLL_CTL_ADD, conn_fd, &ev);정리하기
epoll 인스턴스도 단순한 파일 디스크립터이므로 서버를 종료할 때 close()로 해제합니다.
epoll fd를 닫으면 커널의 관심 목록이 해제됩니다. 아직 열려 있는 감시 대상 소켓은 계속 열려 있으므로, 해당 소켓의 자원을 해제하려면 별도로 닫아야 합니다.
close(epfd);빠른 확인
epoll 설정 API를 얼마나 이해했는지 확인해 보세요.
요약
epoll_create1()로 인스턴스를 만든 다음, ADD, MOD, DEL을 사용해 epoll_ctl()로 관심 이벤트를 관리합니다. 각 struct epoll_event에는 events 마스크와 data 공용체가 들어 있습니다.
단순함이 중요하면 수준 트리거 방식을, 에지 트리거 성능이 필요하면 EPOLLET을 선택합니다. 다음으로 이벤트 루프에서 이 구성 요소들을 작동시켜 보겠습니다.
자주 묻는 질문
“epoll 설정하기” 강의는 무료인가요?
네 — “epoll 설정하기” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 C Academy 강의 전체를 잠금 해제할 수 있습니다. C Academy 강의에는 총 4개의 강의가 포함되어 있습니다.
“epoll 설정하기”에서 뭘 배우나요?
epoll 집합을 만들고 등록해 보세요. 브라우저에서 직접 실행하는 실습 코드로 C Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.
C Academy을(를) 시작하는 데 경험이 필요한가요?
사전 경험은 필요하지 않습니다. CoddyKit의 C Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 2번째 강의입니다.
“epoll 설정하기” 강의는 얼마나 걸리나요?
대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.
이 C Academy 강의에서 코드를 작성하고 실행할 수 있나요?
네. 모든 C Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.
이 강의의 모든 강의
- 블로킹과 논블로킹 I/O
- epoll 설정하기
- 이벤트 루프
- 간단한 에코 서버