Question

Lorsque des sockets sont créés ou que des fichiers sont ouverts/créés en C, le descripteur de fichier attribué au socket/fichier est-il garanti comme étant le descripteur de valeur la plus basse disponible ?Que dit la spécification C sur l'affectation du descripteur de fichier à cet égard, le cas échéant ?

Était-ce utile?

La solution

Il n'est pas garanti qu'il soit le plus bas et dépend de la mise en œuvre (1).En général, cependant, la routine qui attribue les descripteurs de fichiers ouverts utilise une méthode qui vous donne le premier ouvert.Il se peut qu'immédiatement après plusieurs niveaux inférieurs soient gratuits, vous laissant avec un descripteur plus élevé que ce à quoi vous pourriez vous attendre.

La seule raison à laquelle je peux penser pour savoir cela, cependant, est la fonction de sélection, qui est accélérée si vous lui transmettez le descripteur de fichier le plus élevé que vous devez vérifier.

(1) Notez que les implémentations qui suivent la norme IEEE garantissent le descripteur inutilisé le plus bas pour les fichiers, mais cela peut ne pas s'appliquer aux sockets.Toutes les implémentations ne suivent pas la norme IEEE pour open(), donc si vous écrivez un logiciel portable, il est préférable de ne pas en dépendre.

Autres conseils

Je ne pense pas que vous le trouverez dans la spécification C, plus probablement dans la spécification de votre système d'exploitation.D'après mon expérience sous Linux, c'est toujours le plus bas.

Je vais répondre à cela avec une autre question : pourquoi est-ce important ?Vous ne devriez pas comparer le descripteur de fichier avec quoi que ce soit (à moins de vérifier stdin/stdout/stderr) ou de faire des calculs avec.Tant qu'il s'inscrit dans un int (et c'est garanti), c'est tout ce que vous avez vraiment besoin de savoir.

Steve M a raison ;C n'a aucune notion de sockets et ses fonctions d'E/S de fichier utilisent un [pointeur vers un] objet FILE, pas un descripteur.

@aib les open(), close(), lseek(), read(), write() utilisent tous des descripteurs de fichiers.Je n'utilise presque jamais de flux pour les E/S.

@Kyle, c'est important à cause d'instructions comme select().Connaître le descripteur le plus élevé peut améliorer les performances.

La spécification C indique que cela dépend de l'implémentation.Si vous recherchez une implémentation Unix, la page de manuel d'open(2) indique "Le descripteur de fichier renvoyé par un appel réussi sera le descripteur de fichier portant le numéro le plus bas qui n'est pas actuellement ouvert pour le processus."

Cela est utile si vous essayez de joindre un fichier spécifique à un descripteur spécifique.Supposons que vous souhaitiez rediriger stderr vers /dev/null.Quelque chose comme

fermer(2);open("/dev/null", O_WRONLY);

devrait le faire.Vous devez bien sûr capturer le fd renvoyé par open et vous assurer qu'il est égal à 2.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top