2010-11-23 4 views
3

내 프로젝트에 libnetfilter_queue를 사용하고 있습니다. From C app queue는 "queue file descriptor"에 의해 접근 가능합니다. 나는 그들을 처리하기 위해 5 개의 큐와 5 개의 스레드를 가지고있다. 내가 원하는 것은 대기열에 정확하게 2 개의 패킷이있을 때 스레드를 깨우는 것입니다. select 함수와 int 배열을 사용하여 각 큐에 얼마나 많은 패킷이 대기하고 있는지를 알 수있었습니다. 선택> 0 코드로 끝내고 난 후에 어느 큐가 패킷을 받았는지 확인하고 어레이의 값을 증가시킨다. 만약 그것이 2보다 크다면 스레드를 깨운다. 모든 것이 좋겠지 만 select는 recv를 호출 할 때까지 큐에 읽을 데이터가 있음을 나타내므로 별도의 스레드가 이러한 패킷을 처리해야하므로이를 수행 할 수 없습니다. 누구든지이 문제를 해결하는 방법을 알고 있습니까? 내가 SO_RCVLOWAT를 설정할 수 있지만 내 문제를 해결하지 못한다는 것을 알고 있습니다. 왜냐하면 어떤 크기가 2 패킷이 될지 모르기 때문입니다.2 패킷을받은 후 스레드를 깨우는 방법

+0

왜 이런 것이 필요합니까? – jalf

답변

3

Tobu에서 권장하는대로 epoll이 더 나은 선택이며 선택보다 성능이 우수합니다. 그러나 대부분의 이러한 폴링 함수는 누군가 읽지 않는 한 이벤트 (사용 가능한 데이터)가 있음을 나타냅니다. 가능한 경우 다음 모델을 사용하십시오. epoll/select를 사용하여 들어오는 데이터가 워킹 스레드를 깨우는 것을보십시오. 작업자 스레드가 실제로 작업을하기 전에 데이터로 수행 할 작업 (하나의 패킷, 둘 이상)을 결정하게하십시오.

OR : 리더 스레드 1 개 - 작업자 스레드 : 수신되는 모든 데이터를 기다려 읽고 해당 작업자 스레드의 큐에 게시하려면 epoll을 사용합니다. 패킷 수가 임계 값에 도달하면 작업자 스레드를 깨우십시오 (세마포어 사용).

1

사용 가능한 데이터의 양이 변경되면 전송되는 가장자리 트리거 이벤트 통지를 찾고 있습니다. epoll은 EPOLLET 플래그를 사용할 때처럼 작동하며, 기본적으로 알림을 초기화하여 새 패킷에 대한 알림을 계속받습니다.

두 번의 epoll_wait 호출 사이에 여러 패킷이 도착하면 한 번만 알림을받습니다.

+0

당신의 요점을 봅니다. epoll_wait 호출 사이에 너무 많은 시간을 보내고 그 시간에 1 개 이상의 패킷이 수신 되었다면 얼마나 많은 패킷이 수신되었는지 확인할 수 없습니다. 그 정보를 주셔서 감사합니다 – pejotr

+0

사용 가능한 데이터의 양이 변했을 때 _ 또는 빈에서 비어 있지 않을 때 (수신 버퍼 용)? –

+0

나는 패킷이 도착할 때마다 이전의 것으로 확신한다. 커널 코드 justs는 ep_poll_callback이 호출 될 때 플래그를 설정하고 버퍼가 가득 찼는 지 여부를 추적하지 않습니다. – Tobu

관련 문제