[英]accept() interrupted on a signal and epoll_wait()
如果我正在偵聽套接字上使用epoll_wait(),並且當epoll_wait()返回指示它具有活動性(在這種情況下,連接等待被接受)時,如果accept()調用失敗並出現errno = EINTR ,epoll_wait()會指示下一次返回時,同一連接正在偵聽套接字上等待嗎?
即,我是否需要做以下事情:
while(1){
epoll_wait(epfd, &events, maxevents, timeout);
if (events.data.fd == listener){
connsock = accept(listener, &addr, &addrlen);
while (connsock != -1){
if (errno == EINTR){
accept(listener, &addr, &addrlen);
}
}
}
}
為了確保該連接被接受,或者將確保該連接正常工作,並且仍然確保接受被信號中斷的連接:
while(1){
epoll_wait(epfd, &events, maxevents, timeout);
if (events.data.fd == listener){
connsock = accept(listener, &addr, &addrlen);
}
}
在這種情況下,如果accept()被信號中斷,它將在epoll_wait再次返回之后,在下一次通過循環時拾取相同的連接。
顯然,在這兩個示例中,我都作了一些假設(例如,在給定調用epoll_wait的情況下,僅在一個套接字上返回了一個事件),並省略了錯誤檢查(除了accept()上的EINTR,因為它是整個過程)指向此處)以簡化操作
這是邊沿觸發和電平觸發之間的區別。 使用級別觸發(默認設置),您不必擔心。
使用級別觸發的權衡是,您無法讓一個線程處理檢測到的事件,而另一個線程又返回調用epoll_wait
-它只會再次檢測到同一事件。 但是在大多數情況下,無論如何您都不需要這樣做,並且在不可能丟失事件的情況下進行權衡是值得的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.