web-dev-qa-db-fra.com

Pourquoi Select est-il utilisé sous Linux

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

36
user1667307

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 descripteurs nfds 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.

41
Jonathan Leffler

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.

7
DigitalRoss

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

3
Deepankar Bajpeyi