2013-06-08 5 views
1

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

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?

+2

'epoll' не волшебным образом сожрает сигналы. Вы все еще должны сами обрабатывать сигналы. Однако я рекомендую signalfd. –

+1

Действие по умолчанию для большинства сигналов (включая 'SIGTERM') - это прекращение процесса. Итак, в первом случае вы просто наблюдаете за ожидаемым поведением. – alk

ответ

2

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

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

Смежные вопросы