Не завершать программу в epoll_wait

Я хочу справиться, если epoll_wait был прерван по любой причине (например, SIGINT)

while ( true ) {
    n = epoll_wait ( epoll_fd, events, max_events, -1 );
    if ( errno == EINTR ) {
        ...
    }
}

Но отладчик даже не пошел в if, Программа была прекращена в epoll_wait, Я добавил немного магии:

signal ( SIGINT, placebo );
while ( true ) {
    n = epoll_wait ( epoll_fd, events, max_events, -1 );
    if ( errno == EINTR ) {
        ...
    }
}

И все работает как положено. Но это безобразно. Как правильно позволить мне справиться с любым epoll_waitпрерывание?

1 ответ

Решение

Вам нужно либо обрабатывать сигналы, либо блокировать их. Если вы просто хотите игнорировать EINTR, я предлагаю блокировку через sigprocmask () или signal(signum, SIG_IGN) для однопоточного процесса или через pthread_sigmask() для многопоточного процесса. Если вы действительно хотите что-то сделать, используйте sigaction () для установки обработчика.

Не используйте signal () для установки фактического обработчика. Его поведение варьируется в зависимости от платформы UNIX. Прочитайте man-страницы для деталей.

Другие вопросы по тегам