멀티스레드 epoll과 EPOLLRDHUP 어디가 문제인가요?

익명 사용자의 이미지

while(1)
{
clnt_adr_sz=sizeof(clnt_addr);
clnt_sock=accept(serv_sock, (struct sockaddr*)&clnt_addr, sizeof(clnt_adr_sz);
 
event.events=EPOLLRDHUP; // 스레드로 전달된 소켓 디스크립터의 종료(클라이언트 종료)를 기다림
event.data.fd=clnt_sock;
epoll_ctl(epfd, EPOLL_CTL_ADD, clnt_sock, &event);
 
pthread_mutex_lock(&mutex);
clnt_socks[clnt_sock++]=clnt_sock; //전역변수 clnt_socks[]와 clnt_sock
pthread_mutex_unlock(&mutex);
 
pthread_create(&t_id, NULL, handle_clnt, (void*)&clnt_sock);
pthread_detach(t_id);
printf("Connected client IP: %s \n", inet_ntoa(clnt_adr.sin_addr));
 
event_cnt=epoll_wait(epfd, ep_events, EPOLL_SIZE, -1); // 혹시나 해서 출력해보면 실패했다고 -1이 뜹니다.
 
for(i=0; i<event_cnt; i++)
{
epoll_ctl(epfd, EPOLL_CTL_DEL, ep_events[i].data.fd, NULL); // 종료된 클라이언트들의 소켓 디스크립터
close(ep_events[i].data.fd);
printf("closed client: %d \n", ep_events[i].data.fd);
}
}