= Linux에서 Poll 구현 = -- [김도집] [[DateTime(2005-10-14T06:45:14)]] [[TableOfContents]] == 개요 == 커널 소스상에서 따라 가 보도록 한다. ^^ 최초 응용 프로그램에서 poll 함수를 호출하면 리눅스 커널상의 sys_poll 이라는 시스템 콜이 호출이 될 것이다. 따라서 여기서 시작하는 것으로 하죠. == sys_poll == fs/select.c {{{ asmlinkage long sys_poll(struct pollfd __user * ufds, unsigned int nfds, long timeout) }}} 함수 원형을 보자면 위와 같다. 세개의 인자들은 응용 프로그램에서 사용하는 poll(2) 함수와 동일하므로 man 페이지를 참고하자. 1. nfds와 timeout에 대한 값을 검사한다. 사실 이부분은 적당한 값이 들어왔는지 확인 하는 것이기에 그냥 넘어가자. 1. poll_initwait(&table) 처음으로 무엇인가 한다. sys_poll 내부에서 strcut poll_wqueues 형의 tables를 선언했다. 이를 초기화 해 주는 것으로 보인다. 우선 poll_wqueue 자료가 어떤건지 보자. {{{ struct poll_wqueues { poll_table pt; struct poll_table_page * table; int error; }}} 이제는 poll_initwait()를 보자 {{{ void poll_initwait(struct poll_wqueues *pwq) { init_poll_funcptr(&pwq->pt, __pollwait); pwq->error = 0; pwq->table = NULL; } }}} 함수는 간단하다. 그런데 또 함수를 호출한다. ㅡㅡ. init_poll_funcptr()를 따라가 보자. {{{ static inline void init_poll_funcptr(poll_table *pt, poll_queue_proc qproc) { pt->proc = qproc; } }}}