2014-12-02 2 views
8

몇 가지 TCP 연결을 처리하는 드라이버가 있습니다.장치 드라이버에서 select()/poll() 사용

struct sock 님의 목록이있는 커널에서 사용자 공간 응용 프로그램 api의/poll()/epoll()을 (를) 선택하는 것과 유사한 방법을 사용할 수 있습니까?

감사

+3

이 링크를 이미 통과했는지 확실하지 않은 경우 http://stackoverflow.com/questions/11336034/simulate-effect-of-select-and-poll-in-kernel-socket-programming – askb

+0

@askb 대답으로 받아 들일 것입니다. – dimba

+0

은 (는) 업데이트되었습니다. – askb

답변

2

를 통과 한 경우

없음이 명백한 sys_epoll() 인터페이스를 사용하지 않는 것이 쉽게 확인합니다. 결국, 커널 개체에 직접 액세스 할 수 있기 때문에 후프를 뛰어 넘을 필요가 없습니다.

file 개체가 포함되어 있으며 file_operations "vtable"의 폴 방법을 "재정의"합니다. 모든 소켓 주위를 반복 할 수 있으며, 각각에 ->poll()을 호출하고 주기적으로 또는 사용 가능한 데이터가 없을 때 산출 할 수 있습니다.

소켓의 트래픽이 너무 많으면 이보다 더 많은 것이 필요하지 않습니다.

는 API에 대한 참고 사항 : 당신이 그것을 기다릴하지 않으려는하지만 경우

poll() 방법은하는 poll_table() 인수가 필요합니다, 그것은 안전하게 null로 초기화 할 수 있습니다 :

poll_table pt; 
init_poll_funcptr(&pt, NULL); 
... 
// struct socket *sk; 
... 
unsigned event_mask = sk->ops->poll(sk->file, sk, &pt); 

하는 경우 기다리고 싶다면 poll_table으로 설정된 콜백으로 init_poll_funcptr()으로 놀아 라.

관련 문제