• 카테고리

    질문 & 답변
  • 세부 분야

    시스템

  • 해결 여부

    미해결

epoll fd 등록 문제

20.09.02 11:20 작성 조회수 294

1

강의에서는 ep_event에 fd를 등록할 때, epoll_ctl()에 fd를 인자로 지정하니까 ep_event에는 fd를 반드시 넣어줘야 하는 건 아니라는 식으로 말씀하셨는데,

실제로 시험을 해보니, epoll_ctl()과 ep_event의 fd는 의미하는 게 전혀 다르네요.

ep_event에는 STDIN_FILENO을 등록하고, epoll_ctl()에는 fd를 등록한 후, fd에 이벤트를 발생시켰더니(make clean 등) epoll_wait()에서 반환하는 Descriptor는 STDIN_FILENO네요.

이는 즉슨, epoll_ctl()에서는 이벤트를 감시할 Descriptor를 의미하고, ep_event에서는 이벤트 발생 시 반환할 Descriptor를 의미하는 듯 하네요.

답변 1

답변을 작성해보세요.

0

안녕하세요. 인그니야님.

"이는 즉슨, epoll_ctl()에서는 이벤트를 감시할 Descriptor를 의미하고, ep_event에서는 이벤트 발생 시 반환할 Descriptor를 의미하는 듯 하네요."

 => 네. 맞습니다.

"강의에서는 ep_event에 fd를 등록할 때, epoll_ctl()에 fd를 인자로 지정하니까 ep_event에는 fd를 반드시 넣어줘야 하는 건 아니라는 식으로 말씀하셨는데,"

 => 이것도 맞습니다.

말씀하신대로 epoll_ctl()의 세번째 인자인 fd와 네번째 인자인 epoll_event의 member 변수인 data는 의미가 다릅니다. 세번째 인자인 fd는 이벤트를 감시할 fd를 입력하는 것이고, epoll_event.data 변수는 해당 fd에서 이벤트가 발생했을 때 넘겨 받을 어떤 임의의 값 입니다. 이 값으로 어떤 이벤트가 일어났었는지 추정하거나 이벤트가 일어났을 때 코드에서 사용할 값을 넣기도 합니다. 그래서 일반적으로 특정 fd에 대한 이벤트를 받아 처리하기 위해서는 epoll_event.data 변수에 감시할 fd를 넣어 epoll_ctl(add)를 수행하게 됩니다. 하지만 반드시 fd를 넣을 필요는 없습니다. 예를 들어 fd를 포함하고 또 다른 정보도 포함하고 있는 structure pointer를 넣을 수도 있죠. 즉, 내가 넣어준 값 그대로를 이벤트시 리턴하기 때문에 그 어떤 값이라도 가능하지만 이벤트가 발생한 fd를 받아 쓸 경우가 대부분이기 떄문에 fd 혹은 fd를 포함하는 값을 넘기게 됩니다. 

좀 더 정확히 이해를 하셨을지 모르겠네요. 추가 질문 있으시면 또 글 남겨주세요. 좋은 질문 감사합니다~~ :)