Прервать Linux-опрос - PullRequest
       1

Прервать Linux-опрос

3 голосов
/ 29 октября 2010

Я портирую звуковой микшер из directsound в Windows на alsa в Linux. Я опрашиваю, скажем, 16 файловых дескрипторов, используя системный вызов «poll». Теперь мне нужно как-то прервать опрос. В Windows я использую WaitForMultipleObjects, используя события, и когда мне нужно прервать ожидание, я просто устанавливаю SetEvent на одно из событий, вызывающих ожидание возврата. Есть ли способ пометить дескриптор файла в Linux как "готовый", чтобы опрос вернулся?

Я посмотрел на ppoll, но я не знаком с сигналами и не хочу справляться с ненужными условиями гонки. Я имею в виду, если alsa может установить файловые дескрипторы на «готово», я также должен быть в состоянии;)

Ответы [ 2 ]

3 голосов
/ 29 октября 2010

Если вы создаете канал, используя функцию pipe(), вы можете добавить выходной конец в ваш список poll().Затем вы можете написать что-нибудь во входной конец канала, и ваш опрос вернется.Так же, как ваша версия для Windows.

Чтобы это работало, вам нужно использовать что-то асинхронное, например потоки или обработчики сигналов.

Другой вариант - использовать sigaction() для установки сигналаобработчик без флаг SA_RESTART.Вы можете использовать неиспользуемый сигнал типа SIGUSR1 или один из сигналов реального времени.Когда вы хотите прервать poll(), вы отправите этот сигнал, и poll() вернется с -1 и для errno будет установлено значение EINTR.

Возможно, что другой сигнал прервет ваш poll() какхорошо, если только вы не использовали sigmask() для блокировки нежелательных сигналов.

0 голосов
/ 29 октября 2010

Используйте тайм-аут и проверьте условие выхода.

while (not exit_condition):
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
...