42 votes

* nix select et exceptfds / errorfds sémantique

L' sélectionnez syscall prend 3 filedescriptor ensembles pour regarder des fds pour accessible en lecture/écriture et des "exceptions" à la filedescriptor.

Mon sélectionnez la page de manuel n'est pas en état beaucoup sur l' exceptfd descripteur. À quoi sert-il; ce genre d'exceptions qui peut et va informer sur les descripteurs de fichier?

Je suppose que cela peut être différent pour le descripteur de type... si c'est un socket TCP, une pipe, un ats , etc.). Quelqu'un aurait plus d'info sur ce genre d'erreurs select peut-rapport sur les différents types de descripteurs?

32voto

mark4o Points 20472

Il est parfois pensé que exceptfds est nécessaire pour détecter les erreurs, mais c'est une idée fausse. Les erreurs seront signalées dans readfds. Bien que POSIX exige (et même des appels le paramètre errorfds), il dépend de l'OS si des erreurs sont également signalées dans exceptfds. Vraiment, ce paramètre est uniquement nécessaire si vous vous souciez de conditions exceptionnelles, mais rarement est-il besoin de détecter ceux.

Ce qui est considéré comme un état exceptionnel, dépend du type de descripteur de fichier, mais de loin les plus courantes d'utilisation est sur un socket TCP, où il indique que " l'out-of-band de données est disponible pour être lues à l'aide d' recv() avec l' MSG_OOB drapeau. Cependant, TCP out-of-band de données a un certain nombre de bizarreries (par exemple, seulement 1 octet peut être en circulation), et comme un résultat est rarement utilisé.

Dans les noyaux Linux récents exceptfds peut être utilisé pour détecter lorsque certains sysfs modification des attributs. La valeur courante de l'attribut peut être lu en lisant le fichier approprié en vertu de l' /sys, et un select() sur le descripteur de fichier va drapeau exceptfds lorsque l'attribut change. Cependant actuellement, cela ne fonctionne que pour certains de ces attributs, et pour monter les changements (/proc/mounts).

Aussi certains des pilotes de périphérique drapeau certaines spécifiques à l'appareil à l'aide du exceptfds.

3voto

Rob Jones Points 2801

Vous avez raison, cela dépend du type d'appareil que vous faites référence avec les descripteurs de fichier. Donc, c'est différent pour les sockets, Fifo, les ports série, etc...

Regardez la page de man pour la lecture(). Au fond (au moins de mac OS X), il répertorie les différentes erreurs que vous pouvez obtenir pour les différents appareils. En va de même pour write().

Pour les sockets, Fifo et d'autres mécanismes IPC, je voudrais vérifier Unix, Programmation Réseau, Volumes 1 et 2. Autant que je me souvienne, il décrit le type de errnos à attendre pour les différentes conditions d'erreur.

J'ai parcouru ce chemin une fois avec les Fifo. J'ai fini de remue-méninges de toutes les façons le producteur et le consommateur pourrait interagir avec chaque extrémité de la FIFO et a écrit des scénarios de test pour chacune de ces situations. C'était une bonne (bien que fastidieux) pour découvrir toutes les différentes conditions d'erreur. J'ai beaucoup appris et si, finalement, le code, tout fonctionne maintenant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X