6
votes

Imprimer errno comme mnémonique?

J'ai vu errcée symbolique à string - Overflow de pile , donc même si cette question est bash code> associé, je peux déjà dire que ce n'est pas trivial; Mais juste pour confirmer:

existe une fonction API C C, qui, comme strError () code> acceptera le numéro numérique errno code> comme argument - mais qui imprimera le mnémonique (par exemple einval code>) au lieu de la chaîne de description d'erreur (par exemple "argument invalide")? p>

Par exemple, j'aimerais P>

Number: 22 (EINVAL): 'Invalid argument'


5 commentaires

"Argument invalide" est utile. "Einval" n'est pas. Ne vous inquiétez pas de faire cela, s'il vous plaît. Ce n'est pas utile.


Einval est utile à certains publics. Par exemple, vous pouvez grep pour einval en code.


Il n'y a pas de fonction qui fait cela.


Il n'y a pas de moyen standard de le faire. Toutefois, si les codes d'erreur sont garantis pour être identiques sur les plates-formes que vous développez, vous pouvez créer manuellement un tableau de constr * s et imprimer le tableau à l'index de errno .


Je pense que est utile pour ajouter einval sinon si vous vous demandez pourquoi SELECT (ou similaire) renvoie une chaîne donnée, vous avez besoin Pour d'abord traduire à partir de cette chaîne dans un code d'erreur, regardez la documentation. Quant à ne pas être utile pour mettre fin aux utilisateurs, comment "argument invalide" aide-t-il un utilisateur final?


5 Réponses :


1
votes

Vous voulez strError (3) . perror (3) . BTW, le errno (3) la page de l'homme les mentionne. < / p>

Vous n'avez probablement pas besoin d'afficher le einval mnémonique (sauf si vous vous souciez de la génération de code C). Si vous le faites, effectuez une fonction pour cela (essentiellement, un interrupteur ).


2 commentaires

OP sait ce que StreRror est. Je suis sûr qu'ils savent comment ils pourraient écrire un énoncé de commutation basé sur errno.h. Ils demandent s'il existe déjà une mise en œuvre de cela. Je suppose n'est pas.


Merci pour ça, @ BasileSeleTaryNkevitch; Comme @slim a commenté, j'étais errer si une mise en œuvre existait, et maintenant, il semble que cela soit confirmé que cela ne le fait pas. Acclamations!



4
votes

La deuxième partie de votre question est répondue par strError (comme vous le soulignez), ou mieux strerror_r , mais dans glibc au moins Vous pouvez simplement utiliser % m en tant que spécificateur de format.

La première partie est plus intéressante, c'est-à-dire comment obtenez-vous le nom de la constante C pour l'erreur. Je crois qu'il n'y a aucun moyen de le faire en utilisant Standard Glibc . Vous pouvez construire votre propre tableau statique ou table de hachage pour le faire relativement facilement.


1 commentaires

Merci pour la réponse @ABLIGH - J'ai accepté l'autre réponse depuis qu'il mentionne que vous auriez besoin d'une table de recherche supplémentaire, ce que font les solutions de script. Acclamations!



2
votes

Malheureusement pas; Il n'y a pas de support introspection pour les macros d'erreur E .

Vous pouvez le faire trivialement en python: xxx

Ceci est parce que les maintenants Python sont allés au problème de la génération d'une table de recherche: http: // hg. python.org/cpython/file/tip/modules/errnomodule.c


1 commentaires

Merci pour la réponse, @ecatmur - je l'accepterai parce qu'il confirme qu'il n'y a pas de tel soutien et comment Python a-t-il. Acclamations!



2
votes

Quel est le problème?

struct errno_str_t {
    int code;
    const char *str;
} errnos[] = {
    { EINVAL, "EINVAL" },
    ...
};


3 commentaires

Merci pour ça @ user3125367 - Votre approche (et d'autres) nécessite une étape de script supplémentaire, afin de générer une table de recherche; Mais j'étais errant s'il y avait déjà une méthode "intégrée" standard. Acclamations!


Ce n'est pas portable; En fait, sys / errno.h est un emplacement non standard et ne doit même pas exister. Il existe des moyens semi-portables de générer une liste en passant les options de préprocesseur appropriées et en traitement #include mais c'est aussi plutôt laid et piraqué.


@R .. Je sais que tout le point est dans la deuxième ligne de ma réponse, ne prétendant pas être absolument portable (donc dans une certaine mesure ). Mais ne pas avoir cette cartographie dans les normes ou la définition à la main est encore moins portable.



1
votes

Voici la fonction qui renvoie errno comme mnémonique: https://past.ubuntu.com/26170061/

Merci plus tard.


0 commentaires