Не завершать программу в 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-страницы для деталей.