Pourquoi est-sélectionnez utilisé dans Linux
J'ai été en passant par une série de programme et j'ai observé qu'ils utilisent select()
avant d'utiliser read()
. Exactement pourquoi est-il nécessaire. Pourquoi ne peux-nous venons d'appeler directement le read()
et vérifier si elle échoue ou pas ? Aussi pourquoi nous avons pour incrémenter le descripteur de fichier par 1 et le passer alors que je suis de passage le descripteur de fichier qui sont déjà à select()
?
Exemple:
r=select(fd+1, &fds, NULL, NULL, &timeout);
où fds a déjà la valeur de fd
- Un appel à
read(2)
peut bloquer. Aussi, lire surpoll(2)
syscall (ce qui est mieux queselect(2)
pour le multiplexage des fins; en lire plus sur les C10K problem). - qu'entendez-vous par "le multiplexage des fins"?
- Les deux poll(2) et la vieille select(2) sont en attente et mulltiplexing sur plusieurs descripteurs de fichiers. Leur rôle est conceptuellement similaire (mais
poll
est plus C10K, puisqu'en mesure de multiplex sur plus de 1024 descripteurs de fichiers).
Vous devez vous connecter pour publier un commentaire.
La
select()
appel système vous indique si il y a des données à lire sur les descripteurs de fichier qui vous intéresse. Strictement, c'est une question de savoir si une opération de lecture sur le fichier descripteur de bloc ou pas.Si vous exécutez
read()
sur un descripteur de fichier, telle que celle qui est connecté à un port série et il n'y a pas de données à lire, alors, l'appel sera suspendue jusqu'à ce qu'il y a des données à lire. Les programmes à l'aide deselect()
ne souhaitez pas être bloqué comme ça.Vous aussi vous demander:
C'est probablement en spécifiant la taille de la FD_SET
mais probablement faire mal. Le premier argument deselect()
est connu commenfds
et POSIX dit:Donc, pour tester un descripteur de fichier
n
, la valeur ennfds
doit être d'au moinsn+1
.select()
appels système?; tu peux regarder existe-il des plates-formes où l'utilisation de la structure de la copie sur un FD set (pourselect()
oupselect()
) provoque des problèmes?. Vous pouvez rechercher d'autres questions sur la SORTE de l'utilisation de '[c] sélectionnez'.O_NONBLOCK
mais cela implique que vous ne l'utilisez passelect()
(parce queO_NONBLOCK
descripteurs de fichiers sont toujours prêts pour la lecture) et il implique que vous serez à l'aide de vote sur les descripteurs de fichiers ouverts pour trouver celui qui a le travail prêt. Une discussion similaire s'applique à écrire des descripteurs de fichiers. À l'aide deselect()
évite la surcharge des bureaux de vote.Programmes qui veulent continuer à fonctionner tout en aussi lecture interactive de la saisie de l'utilisateur1 doivent être multithread ou ils ont besoin de lire les flux d'entrée avec soin et, plus précisément, sous certaines conditions.
Select(2)
peut être utilisé pour mettre en œuvre la deuxième motif de conception. Il permet de déterminer si l'entrée peut être lu sans le blocage de l'ensemble de l'application.1. Ou une autre entrée qui arrive à l'improviste.
poll(2)
(2)
? Qu'est-ce que cela indique? Il me fait penser à un argument passé, ou "lire la deuxième définition" (comme un dictionnaire anglais peut avoir plusieurs significations et usages pour le même mot).Vous utilisez sélectionnez appel lorsque vous devez constamment surveiller les descripteurs de fichier jusqu'à ce qu'ils préparez-vous pour certains IO sans blocage.
Généralement utilisée lorsque vous voulez IO (par exemple read() )non bloquant , lire la :page de man
Également lire les API