2015-09-01 2 views
0

У меня есть приложение C с использованием опроса, чтобы дождаться некоторых данных.Как остановить опрос() от прерывания от определенного сигнала

В настоящее время я реализую остальную часть своего приложения в этом, и я использую прерывания по времени (SIGRTMIN). Как и ожидалось, poll() возвращается, если один из моих других таймеров перезвонит.

Как остановить опрос от этого? Я читаю много о ppoll(), но не знаю, как это использовать ... Могу ли я использовать это, чтобы эта функция не возвращалась при запуске события таймера?

(у меня нет никаких проблем с опроса задерживается несколько мс)

+0

Используйте 'sigprocmask()' (или 'pthread_sigmask()', для многопоточной программы), чтобы найти текущую сигнальную маску 'sigaddset()' сигнал, который вы хотите заблокировать на время '[ p] poll() 'либо передать сигнальную маску на' ppoll() 'или' sigprocmask()/pthread_sigmask() 'перед вызовом' poll() 'и принять, что будет состояние гонки. – EOF

ответ

1

Если блокирующий поток/процесс в poll() получает разблокированный сигнал затем poll()будет быть прервана. Если вы не хотите, чтобы это произошло, вы можете заблокировать желаемый сигнал перед вызовом poll(), а затем разблокировать его после возврата poll() (см. sigprocmask()). Обратите внимание, однако, что это не приведет к задержке poll() - совсем наоборот. Во всяком случае, это приведет к задержке приема сигнала. Если poll() блокируется достаточно долго, это может привести к остановке нескольких сигналов RT, чтобы после разблокировки этого сигнала вы получали его несколько раз подряд.

Вы должны вместо этого проверить возвращаемое значение poll() (которое вы всегда должны делать в любом случае) и повторить попытку, если это EINTR.

+0

Поскольку использование маскировки сигнала будет маскироваться для всего приложения, поэтому другие таймеры также не будут прерывать, я решил поместить время вокруг опроса и добавил вокруг него набор таймеров. Я получаю временную метку до того времени, и пока я получаю еще одну метку времени. Если разница между этими таймерами превышает тайм-аут, предоставленный опросу, я выхожу из того времени, а также если опрос, который был отменен, и есть что-то доступное (POLLIN). – spambas

+0

Выполняется ли обработчик опроса в пользовательском пространстве в контексте прерывания? – ransh

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