簡體   English   中英

在信號和epoll_wait()上中斷accept()

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM