Pourquoi utiliser select () au lieu de sleep ()?

Je travaille sur un chapitre consacré à l’audio sur iPhone et j’ai trouvé une section de code que je ne comprends pas:

while (aqc.playPtr < aqc.sampleLen) { select(NULL, NULL, NULL, NULL, 1.0); } 

( L’exemple de code complet se trouve aux pages 163-166 ). D’après ce que j’ai compris du code, l’audio est en cours de traitement sur un autre thread et la boucle while est simplement là pour empêcher le thread principal de se terminer pendant que l’audio est en cours de traitement.

Ce que je ne comprends pas, c’est pourquoi select() est utilisé à la place de sleep() .

D’après ce que j’ai lu, select() est utilisé pour surveiller les changements dans les E / S et le passage à NULL ne fait rien de significatif. J’ai exécuté le code en utilisant sleep() et cela fonctionne comme prévu. (Ma connaissance du POSIX de bas niveau est presque inexistante.)

Sélectionnez autoriser une attente sub-seconde précise et est plus portable que le mode veille. Il y a d’autres façons d’attendre, voir cette question .

Mais le paramètre timeout de select ne doit pas être un float, mais un pointeur sur struct timeval. Je suis surpris que le code que vous montrez comstack même. Plus: cette étrange sélection conditionnelle est suivie d’un sumil inconditionnel (1). Cela me semble inutile.

Utiliser select() avec NULL rfds , wfds et efds est un moyen idiomatique de passer en veille de manière portable avec une résolution inférieure à la seconde.

Sleep (3) peut être implémenté en utilisant des signaux. Cela dépend de la plate-forme.

Lorsque vous utilisez select (2) et poll (2), vous savez qu’aucun signal ne sera impliqué, ce qui est souvent très utile. Par exemple, si vous utilisez alarm (2), vous ne devriez pas également utiliser sleep (3), car “mélanger les appels entre alarm et veille est une mauvaise idée” (selon la page de manuel).

De même, select et poll vous donnent une granularité de l’ordre de la milliseconde pendant le sumil, mais le sumil n’a qu’une granularité exprimée en secondes.

Lorsque vous utilisez le signal SIGALM dans votre application et que vous utilisez les fonctions (u)sleep , lorsque SIGALRM se produit, le programme quitte immédiatement la fonction veille. Le meilleur moyen de passer en veille est donc d’attendre la fonction select .

 struct timeval tv; tv.tv_sec = 1; tv.tv_usec = 1000; do { ret = select(1, NULL, NULL, NULL, &tv); } while((ret == -1)&&(errno == EINTR)); //select is interruped too 

Il n’y a aucune raison de le faire. Il n’y a aucune raison de dormir () non plus. On devrait toujours s’attendre à au moins un événement – demande d’arrêt du programme.