9
votes

Où puis-je voir la liste des fonctions qui interagissent avec errno?

Dans le livre "Le langage de programmation C" indique:

"Beaucoup de fonctions dans la bibliothèque Définir les indicateurs d'état lorsque l'erreur ou la fin du fichier se produisent. Celles-ci Les indicateurs peuvent être définis et testés explicitement. De plus, l'expression entier errno (déclarée dans ) peut contenir un numéro d'erreur qui donne des informations supplémentaires sur le plus erreur récente. "

Où puis-je voir une liste de ces fonctions?


1 commentaires

@Leif, cool que vous travaillez à travers K & R. Je viens de finir de faire la même chose pendant quelques jours pendant mes vacances. (-:


6 Réponses :


5
votes

Vous devez supposer que toute fonction peut définir errno, pas seulement celles de la bibliothèque standard. Une liste serait donc un peu inutile.


5 commentaires

Je ne suis pas d'accord, même si la vie serait certainement plus facile à votre façon! Je me lance actuellement avec certaines bibliothèques intégrées qui renvoient des messages comme "une erreur survenue: errno = 0" afin que l'OP intime, si vous pardez le jeu de mots irrésistible sur votre nom, il serait utile de pouvoir filtrer ces fonctions qui ne définissent pas errno sur des valeurs utiles.


@Adam quel jeu de mots serait-ce? Je suppose que je manque quelque chose d'évident et grossier?


La question ne concerne aucune fonction - c'était à propos de ceux de la bibliothèque standard. La norme documente les fonctions de la bibliothèque qui modifient errno. Ce qui est inutile, c'est de traiter les fonctions garanties pour ne pas modifier errno comme si elles le risquent.


@Neil: un filtre à Butterworth est un circuit électronique classique qui a enseigné aux sous-traits EE dans le cadre de leur bizarrement mathématique. Désolé de décevoir si vous croyiez plus d'impolitesse. :-) @dingo: convient que ces fonctions sont documentées et (nous espérons) suivre les normes. Mon point était que je n'ai jamais rencontré une liste canonique de fonctions qui définissent Erno sur des valeurs utiles.


@Adam Yeah, je connaissais le filtre de Butterworth - j'espérais quelque chose de plus (ou effectivement) impoli :-(



0
votes

Une question correcte pourrait être quelles sont les valeurs errno peut obtenir et ce que chacun d'entre eux signifie. Vous pouvez les voir énumérés dans intro (2) .


0 commentaires

-1
votes

Vous pouvez utiliser votre éditeur préféré et la "Rechercher dans les fichiers ..." pour rechercher des fichiers contenant le mot-clé errno .


2 commentaires

Et des polices audacieuses prennent plus d'espace sur le disque?


Je ne te comprends pas. Quoi qu'il en soit, je voulais rechercher des fichiers de bibliothèque (* .C, * .cpp).



1
votes

Près de toutes les fonctions de la bibliothèque POSIX peuvent définir errno si une erreur se produit, c'est-à-dire lorsque la fonction renvoie -1. Une exception sont des fonctions de filetage car la définition d'une variable d'erreur globale de plusieurs threads serait très dangereuse. Ils rentrent 0 sur le succès, le code d'erreur autrement (ce code est compatible avec Errno afin que vous puissiez utiliser les fonctions StrError et Perror sur elle).


4 commentaires

Existe-t-il vraiment une implémentation de POSIX qui a des threads mais n'a pas d'errno local sur le thread?


errno est spécifié pour être spécifique au thread. -1 pour la désinformation sur cette question.


Je n'ai jamais dit que Erno n'était pas spécifique au fil. Les fonctions de threading ne définissent pas errno de toute façon.


Par la définition d'une variable d'erreur globale de plusieurs threads : Selon la norme, le errno est une "macro qui se développe à une lvalue modifiable qui a du type int et de filtre de stockage local" Le errno "n'a pas besoin d'être l'identifiant d'un objet".



6
votes

La norme indique ceci sur errno :

La valeur de Erno est zéro au démarrage du programme, mais n'est jamais réglé sur zéro par une bibliothèque fonction. La valeur de Erno peut être définie sur NONZERO par un appel de la fonction de bibliothèque si une erreur est une erreur, à condition que l'utilisation d'errno n'est pas documentée dans la description de la fonction de cette norme internationale.

Ce qui me dit que toute fonction de bibliothèque peut se viser avec errno de quelque manière que ce soit, sauf:

  • Il ne peut pas définir errno à 0
  • Il ne peut pas faire ce qu'il aime si la norme dit explicitement autrement

    Notez que la norme suggère ce qui suit dans une note de bas de page:

    Ainsi, un programme qui utilise errno pour la vérification des erreurs doit la définir sur zéro avant l'appel de la fonction de la bibliothèque, puis inspecte-la avant l'appel de la fonction de bibliothèque ultérieure. Bien sûr, une fonction de bibliothèque peut enregistrer la valeur de errno à l'entrée, puis la définir sur zéro, tant que la valeur d'origine est restaurée si errno est toujours. zéro juste avant le retour.

    Comme indiqué dans d'autres réponses, il est courant pour les fonctions qui ne sont pas dans la norme de définir errno .


0 commentaires

0
votes

@aDam, comme dit Neil, une fonction peut être compilée contre errno.h et définir errno. Il est par définition, impossible de répertorier tous les utilitaires compilés de cette manière d'utiliser la fonctionnalité de base errno.

Cela dit, il y a plusieurs manières que des erreurs peuvent être rapportées à un utilisateur. Utiliser Erno n'est qu'un.


0 commentaires