0
votes

Quelle est la différence entre la fermeture [fermeture (3)] et le nettoyage [fd_clr (3)] un descripteur de fichier?

J'ai des problèmes avec un test de logiciel automatisé, qui blâme une utilisation de la ressource libérée lorsque j'utilise fd_clr (3) après avoir utilisé Fermer (3) dans une FD. Y a-t-il quelque chose qui ne va pas avec cela? XXX


3 commentaires

@SomeProgrammerDude Je suis d'accord. Il est demandé à beaucoup de ces questions car les gens ne font pas la recherche appropriée à l'avance.


Si les gens comprenaient complètement tout ce qu'ils ont lu, Stackoverflow n'existerait pas.


Ensuite, essayez d'écrire ce que vous avez dérangé sur ce que vous avez lu dans votre question. Que vous demandez-vous spécifiquement? Quels sont vos doutes? Tes pensées? Et s'il vous plaît lire Les pages d'aide , prendre The SO Tour , lisez à propos de Comment poser de bonnes questions , ainsi que Cette question de question .


3 Réponses :


2
votes

fd_clr () ne modifie que local fd_set , qui est une structure de données C pour stocker des informations sur une liste des descripteurs de fichiers.

ferme () est un appel système qui ferme le descripteur de fichier.

Le fd_set est utilisé dans le SELECT () appel système. Avec SELECT () Vous obtenez des informations sur l'état de la liste des descripteurs de fichier stockés dans votre fd_set struct.

La raison pour laquelle vous voyez le fd_clr () juste en dessous du Fermer () , est qu'il n'y a plus besoin / but en demandant à l'état si le descripteur de fichier fermé .


1 commentaires

Il n'y a plus besoin / but de demander à l'état si le descripteur de fichier fermé. Il n'y a pas seulement aucun besoin de demander à l'état, appelant SELECT () sur un descripteur de fichier fermé est Il est également faux que le descripteur de fichier puisse être réutilisé par un autre thread pour un fichier entièrement indépendant.



1
votes

Alors, fd_isset et fd_clr font partie de l'API PSelect, en savoir plus sur la page Man ici http://man7.org/linux/man-pages/man3/fd_clr.3.html

Il gère essentiellement une liste de tous les numéros de fichier que vous souhaitez attendre, dans votre prochain appel à PSélectionnez, ce qui précise donc un fichier que vous avez fermé a du sens.

Votre code demande, pour tous les fichiers que j'écoutais, fermez le fichier et retirez de l'ensemble.

Fermer () ferme le fichier. Vous ne devez pas appeler à plusieurs reprises sur le même fichier ou vous verrez cette erreur. Peut-être qu'un autre code ferme également le fichier?


1 commentaires

Je vérifierai si Fermer est appelé le même fichier dans un autre code. Merci!



1
votes

Si le logiciel marque vraiment une telle utilisation de fd_clr , le logiciel automatisé est cassé. Vous êtes Supprimer le descripteur de fichier fermé à partir de l'ensemble observé et fd_clr est précisément le moyen de le faire.

comme un travail autour, vous pouvez transposer le ferme () et fd_clr qui ne changera pas la signification du code, mais apaisera l'outil d'analyse de buggy .


0 commentaires