Вопрос

Я портирую аудиомеситель из 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top