Прервать избираться от опроса Linux
-
27-09-2019 - |
Вопрос
Я портирую аудиомеситель из Directsound на окнах в ALSA на Linux. Я опросаю, скажем, 16 файловых дескрипторов, используя системный вызов «Опрос». Теперь мне нужно иметь возможность как-то прервать опрос. В Windows я использую queptformultiPleObjects, используя события, и когда мне нужно прервать ожидание, я просто свидетельствует о одном из событий, вызывающих ждать, чтобы вернуться. Есть ли способ отметить файловый дескриптор в Linux «готов», чтобы опрос вернулся?
Я посмотрел на PPOLL, но я не знаком с сигналами, и я не хочу обращаться с ненужными гоночными условиями. Я имею в виду, если ALLA может установить дескрипторы файлов на «готов», я должен также иметь возможность;)
Решение
Если вы делаете трубу, используя pipe()
Функция, вы можете добавить выходной конец в свой poll()
список. Тогда вы можете написать что-то на входной конец трубы, а ваш опрос вернется. Очень похоже на вашу версию Windows.
Вам нужно будет использовать что-то асинхронные подобные нити или обработчики сигналов, чтобы сделать эту работу.
Другой вариант будет использовать sigaction()
Чтобы установить обработчик сигнала без то SA_RESTART
флаг. Вы можете использовать неиспользуемый сигнал, как SIGUSR1
или один из сигналов в реальном времени. Когда вы хотите прервать poll()
Затем вы отправляете этот сигнал и poll()
вернутся с -1 и errno, установленным в EINTR.
Было бы возможно для другого сигнала прервать ваш poll()
Также, если вы не использовали sigmask()
блокировать нежелательные сигналы.
Другие советы
Используйте тайм-аут и проверьте условие выхода.
while (not exit_condition):
int poll(struct pollfd *fds, nfds_t nfds, int timeout);