Programmes qui veulent continuer à s'exécuter tout en aussi la lecture des entrées utilisateur interactives doit être multithread ou ils doivent lire attentivement les flux d'entrée et, plus précisément, de manière conditionnelle.
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'ensemble de l'application.
Le select()
L'appel système vous indique s'il y a des données à lire sur les descripteurs de fichiers qui vous intéressent. Strictement, il s'agit de savoir si une opération de lecture sur le descripteur de fichier 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 sera suspendu jusqu'à ce qu'il y ait des données à lire. Programmes utilisant select()
ne souhaite pas être bloqué comme ça.
Vous demandez également :
Pourquoi devons-nous incrémenter le descripteur de fichier de 1 et le transmettre alors que je transmets le descripteur de fichier déjà défini sur
select
?
Cela spécifie probablement la taille du FD_SET. Le premier argument de select()
est connu sous le nom de nfds
et POSIX dit :
Le
nfds
L'argument spécifie la plage de descripteurs à tester. Le premiernfds
les descripteurs doivent être vérifiés dans chaque ensemble ; c'est-à-dire les descripteurs de zéro ànfds-1
dans les ensembles de descripteurs doivent être examinés.
Donc, pour tester un descripteur de fichier n
, la valeur en nfds
doit être au moins n+1
.
Vous utilisez l'appel select lorsque vous devez surveiller en permanence les descripteurs de fichiers jusqu'à ce qu'ils soient prêts pour des E/S sans blocage.
Généralement utilisé lorsque vous voulez que l'IO (par exemple read()) ne soit pas bloquant, lisez la page :man
Lisez également les API associées