1. 程式人生 > >linux-epoll-linux4.1.10

linux-epoll-linux4.1.10

epoll-linux4.1.10

struct eventpoll {
?...
wait_queue_head_t wq;

調用epoll的進程會在這個waitqueue上睡眠???
wait_queue_head_t poll_wait;

每個epoll也是一個文件,所以他可以被其他epoll在監測,這個poll_wait就是文件的一個waitqueue,當把這個文件添加到另一個epoll監測時,會創建一個等待結構掛載到poll_wait上。

};

每個epoll對應一個eventpoll。


至於epoll的喚醒,就拿socket文件舉例,當他可用時會調用到ep_poll_callback(當文件加入到epoll的監控時,會創建等待節點然後掛載到各自的等待隊列上,而這個等待節點中的wakeup是ep_poll_callback,因為在ep_ptable_queue_proc中調用了init_waitqueue_func_entry,它沒用到default_wake_function(可以喚醒一個進程)),該函數前半部的功能可查百度,後半部是調用wake_up_locked(&ep->wq),當調用epoll的進程發現無可用的文件描述符時就會睡眠在ep->wq這個waitqueue,wake_up_locked(&ep->wq)會調用到default_wake_function,從而喚醒進程,至於ep_poll_safewake(&ep->poll_wait),是為了一種叠代的情況(一個epoll監測另一個epoll的情況)。


linux-epoll-linux4.1.10