기본 콘텐츠로 건너뛰기

라벨이 event인 게시물 표시

fork는 epoll에서 감시하는 객체까지 복제하지 않는다.

리눅스 서버에서 epoll을 이용해서 event를 감시하면서 동시에 fork할 때는 주의가 아주매우많이 필요하다. 커널 소스를 직접 들여다 봐야하겠지만, 대략 시간이 없고 귀찮은 관계로 생략한다. 결론부터 말하자만 epoll_fd로 관리하는 감시할 이벤트 목록은 커널영역에 만들어지며, fork가 이를 복제하지 않기 때문에 부모 자식 간에 동일한 epoll_fd로 목록을 수정하면 인생 종치는거다. 자자... 말이 길었다. 대충 소스를 보도록 하자. #include <sys/epoll.h> #include <stdio.h> #include <stdlib.h> #include <string.h> int main(int argc,char* argv[]) {         const size_t epoll_size(1024);         int epoll_fd = epoll_create(epoll_size);         struct epoll_event ev;         memset(&ev, 0, sizeof(ev));         ev.events = EPOLLIN;         epoll_ctl(epoll_fd, EPOLL_CTL_ADD, 0, &ev);         printf("%s\n", strerror(errno));         if (!fork())    ...