Je passais par un programme série et j'ai observé qu'ils utilisent select()
avant d'utiliser read()
. Pourquoi est-ce exactement nécessaire? Pourquoi ne pouvons-nous pas appeler directement read()
et vérifier s'il échoue ou non? Aussi pourquoi devons-nous incrémenter le descripteur de fichier de 1 et le passer pendant que je passe le descripteur de fichier déjà défini sur select()
?
Exemple:
r=select(fd+1, &fds, NULL, NULL, &timeout);
où fds a déjà la valeur de fd
L'appel système select()
vous indique s'il existe des données à lire sur les descripteurs de fichiers qui vous intéressent. Il s'agit strictement de savoir si une opération de lecture sur le le descripteur de fichier se bloquera ou non.
Si vous exécutez read()
sur un descripteur de fichier - tel que celui connecté à un port série - et qu'il n'y a pas de données à lire, l'appel se bloquera jusqu'à ce qu'il y ait des données à lire. Les programmes utilisant select()
ne souhaitent pas être bloqués comme ça.
Vous demandez également:
Pourquoi devons-nous incrémenter le descripteur de fichier de 1 et le transmettre pendant que je passe le descripteur de fichier déjà défini sur
select
?
Cela indique probablement la taille du FD_SET mais le fait probablement mal. Le premier argument de select()
est appelé nfds
et POSIX dit:
L'argument
nfds
spécifie la plage de descripteurs à tester. Les premiers descripteursnfds
doivent être vérifiés dans chaque ensemble; c'est-à-dire que les descripteurs de zéro ànfds-1
dans les jeux de descripteurs doit être examiné.
Ainsi, pour tester un descripteur de fichier n
, la valeur dans nfds
doit être au moins n+1
.
Les programmes qui souhaitent continuer à fonctionner pendant également la lecture des entrées utilisateur interactives1 doivent être multithread ou ils doivent lire les flux d'entrée attentivement et, en particulier, conditionnellement.
Select(2)
peut être utilisé pour implémenter le deuxième modèle de conception. Il peut déterminer si l'entrée peut être lue sans bloquer l'application entière.
1. Ou une autre entrée qui arrive de façon imprévisible.
Vous utilisez l'appel sélectif lorsque vous devez constamment surveiller les descripteurs de fichiers jusqu'à ce qu'ils soient prêts pour certains IO sans blocage).
Généralement utilisé lorsque vous souhaitez que le IO (par exemple read ()) non bloquant, lisez le: page de manuel
Lisez également les API associées