accept () прервана по сигналу и epoll_wait () - PullRequest
4 голосов
/ 01 января 2012

Если я выполняю epoll_wait () в прослушивающем сокете и когда epoll_wait () возвращает указание на то, что он имеет активность (в данном случае соединение ожидает ожидания accept () ed), то если вызов 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);
                }
            }
        }
    }

, чтобы удостовериться, что соединение получено, или это будет работать, и все еще гарантировать, что соединение, для которого accept () было прервано сигналом, будет принято:

while(1){
    epoll_wait(epfd, &events, maxevents, timeout);
    if (events.data.fd == listener){
        connsock = accept(listener, &addr, &addrlen);
        }
    }

где в этом случаеесли accept () прерван сигналом, он просто в следующий раз перехватит то же соединение через цикл после возвращения epoll_wait.

Очевидно, что в обоих этих примерах я делаю некоторые предположения (это тольконапример, одно событие в одном сокете возвращается в данном вызове epoll_wait и не включает проверку ошибок (за исключением EINTR для accept (), посколькувот и весь смысл) упростить вещи

1 Ответ

2 голосов
/ 01 января 2012

Это разница между запуском фронта и запуском уровня. Используйте уровень по умолчанию, и вам не нужно об этом беспокоиться.

Компромисс с триггером уровня состоит в том, что вы не можете заставить один поток обрабатывать обнаруженное событие, в то время как другой поток возвращается к вызову epoll_wait - он просто снова обнаружит то же событие. Но в большинстве случаев вам все равно не нужно этого делать, и компромисс невозможности проиграть событие того стоит.

...