Domanda

sto porting un mixer audio da DirectSound su Windows per ALSA su Linux. Sono polling, diciamo, 16 descrittori di file utilizzando la chiamata di sistema "sondaggio". Ora ho bisogno di essere in grado di interrompere il polling in qualche modo. Su Windows Sto usando il WaitForMultipleObjects con eventi e quando ho bisogno di interrompere l'attesa ho appena SetEvent su uno degli eventi che causano l'ora di tornare. C'è un modo per marcare un descrittore di file in Linux "pronto" in modo che il sondaggio tornerà?

Ho dato un'occhiata a ppoll ma non ho familiarità con i segnali e non voglio che per gestire le condizioni di gara non necessarie. Voglio dire, se alsa possibile impostare i descrittori di file di "pronto" Vorrei anche essere in grado di;)

È stato utile?

Soluzione

Se si commette un tubo con la funzione pipe(), è possibile aggiungere alla fine di uscita nella vostra lista poll(). Poi si può scrivere qualcosa nella parte finale di ingresso del tubo e il tuo sondaggio tornerà. Proprio come la versione di Windows.

avresti bisogno di utilizzare qualcosa di asincrono come fili o gestori di segnali di fare quel lavoro.

Un'altra opzione sarebbe quella di utilizzare sigaction() per impostare un gestore di segnale senza la bandiera SA_RESTART. Si potrebbe utilizzare un segnale non utilizzato come SIGUSR1 o uno dei segnali in tempo reale. Quando si desidera interrompere il poll() quindi si invia il segnale e poll() tornerete con -1 e errno impostato su EINTR.

Si sarebbe possibile per un segnale diverso per interrompere il vostro poll() così, a meno che non si è utilizzato sigmask() per bloccare i segnali indesiderati.

Altri suggerimenti

Usa il timeout e verificare la condizione di uscita.

while (not exit_condition):
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top