제페 2018. 4. 18. 11:43
반응형

PollFd.events 체크할 이벤트 목록을 지정한다. | 비트를 결합하여 여러 개를 있다.

 

PollFd fd;
fd.events = PollRdNorm | PollWrNorm;

 

Poll 함수가 성공적으로 호출되면 revents 인자에 감지된 이벤트가 등록되어있다. 여러 개의 이벤트가 번에 등록되며, bit연산자 and(&) 통해 체크할 있다.

 

Poll(fd);

if(fd.revents & PollRdBand)
{// RdBand 처리 ...
}

if(fd.revents & PollRdNorm)
{// RdNormal 처리 ..
}

 

events revents 세팅되는 이벤트의 의미는 다음과 같다.

 

PollIn : 높은 우선 순위가 아닌 데이터를 읽을 있다. 블러킹 없이

PollPri: 높은 우선 순위 데이터를 읽을 있다. 블러킹 없이.

PollOut: 파일 디스크립터에 있음.

PollErr: 파일 디스크립터에 에러가 발생했다. 장치나 소켓에. 플래그는 events 지정하지 않았어도 항상 체크된다.

PollHup: 디바이스나 소켓 연결이 끊겼다. 플래그는 events 지정하지 않았어도 항상 체크된다. PollHup PollOut 절대 동시에 세팅될 없다.

PollNVal: 파일 디스크립터가 열리지 않았다. 플래그는 events 지정하지 않았어도 항상 체크된다.

PollRdNorm: 일반 데이터를 읽을 있다. 블러킹 없이.

PollRdBand: 0 아닌 우선 순위의 데이터를 읽을 있다. 블러킹 없이

PollWrNorm: 일반 데이터를 있다. 블러킹 없이.

PollWrBand: 0 아닌 우선 순위의 데이터를 있다 블러킹 없이.


난 저 이벤트 중, Band가 붙은 이벤트 처리는 별도로 하지 않았다. 

OOB 처리에 관한 Q&A: https://stackoverflow.com/questions/589928/socket-programming-how-do-i-handle-out-of-band-data

결론: 서버-클라이언트 간 통신에서 서로 OOB를 주고 받지 않도록 했다면 별도의 Band 처리는 신경쓰지 않는다.

 

지정하지 않아도 항상 체크되는 이벤트들(Err, Hup, NVal)은 항상 처리하도록 코드를 작성하자.

 

if(fd.revents & PollHup)
{// 연결 끊김 처리...
}


추가적으로 PollHup PollOut 동시에 설정될 없는 이유는 간단하다. 파일 디스크립터와 연결이 끊기면 파일 디스크립터에 없으니, 개가 함께 설정 된다면 그것이 오히려 모순이 되기 때문이다.


반응형