Question

Je suis PORTAGE un mélangeur audio de DirectSound sous Windows pour ALSA sur Linux. Je suis vote sur, disons, 16 descripteurs de fichiers en utilisant l'appel système « sondage ». Maintenant, je dois pouvoir faire avorter le vote en quelque sorte. Sous Windows je suis en utilisant les WaitForMultipleObjects en utilisant des événements et quand je dois interrompre l'attente, je viens SetEvent sur l'un des événements provoquant l'attente de revenir. Est-il possible de marquer un descripteur de fichier sous Linux « prêt » pour que le scrutin sera de retour?

J'ai pris un coup d'œil à ppoll mais je ne suis pas familier avec les signaux et je ne veux pas gérer des conditions de course inutiles. Je veux dire, si alsa peut définir les descripteurs de fichiers « prêt » je devrais aussi pouvoir;)

Était-ce utile?

La solution

Si vous faites un tuyau à l'aide de la fonction pipe(), vous pouvez ajouter à la fin de la sortie dans votre liste de poll(). Ensuite, vous pouvez écrire quelque chose dans l'extrémité d'entrée du tuyau et votre sondage retournerez. Tout comme votre version de Windows.

Vous avait besoin d'utiliser les asynchrone quelque chose comme des fils ou des gestionnaires de signaux pour faire ce travail.

Une autre option serait d'utiliser sigaction() pour définir un gestionnaire de signal sans l'indicateur SA_RESTART. Vous pouvez utiliser un signal utilisé comme SIGUSR1 ou l'un des signaux en temps réel. Lorsque vous voulez interrompre le poll() alors vous envoyer ce signal et poll() retournerez avec -1 et errno EINTR.

Il serait possible pour un signal différent pour interrompre votre poll() ainsi, à moins que vous avez utilisé sigmask() pour bloquer les signaux indésirables.

Autres conseils

Utilisez le délai d'attente et vérifier l'état de sortie.

while (not exit_condition):
    int poll(struct pollfd *fds, nfds_t nfds, int timeout);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top