errno et perror() - C - Programmation
Marsh Posté le 22-02-2007 à 10:32:27
ReplyMarsh Posté le 22-02-2007 à 11:27:02
Est-ce que lorsqu'il n'y a aucune erreur, errno a une valeur indéterminé ?
Et dans ton code, tu n'as aucune erreur ou fonction qui positionne errno
Car, dans ton code, il me semble que ta valeur d'errno ne veut rien dire :
Code :
|
EDIt : Je n'ai pas vu que tu affectais errno..
Marsh Posté le 22-02-2007 à 13:53:12
Elmoricq a écrit : Et un second perror() affiche quelque chose ? |
Oui, il m'affiche "illegal seek" et errno reste à 29 => le nombre affecté n'est pas aléatoire !!!
J'ai testé le même programme sur Aurox => même résultat (ce qui est normal, le résultat dépend de la libc et non de la distribution). Je l'ai aussi testé sur Solaris 2.6 et là, la valeur de errno n'est pas modifiée !!!!
nORKy a écrit : Est-ce que lorsqu'il n'y a aucune erreur, errno a une valeur indéterminé ? |
errno, comme toute variable, possède toujours une valeur. Et si errno n'a pas été rempli par le système lors d'une erreur système, sa valeur est forcément indéterminée mais ce n'est pas grave car s'il n'y a pas d'erreur, il n'y a pas de raison de s'intéresser à sa valeur. Et s'il y a une erreur, sa valeur n'est plus indéterminée.
Marsh Posté le 22-02-2007 à 21:03:56
Sve@r a écrit : Un truc que j'arrive pas à comprendre. A moins que je ne fasse erreur, il semble que "perror()" modifie errno !!! |
Y're kidding aren't ya ?
|
|
Code :
|
errno=5 |
Marsh Posté le 23-02-2007 à 09:52:40
Emmanuel Delahaye a écrit : Y're kidding aren't ya ? |
AHHH !!! QUelle horreur !!! J'ai oublié dans mon exemple de mettre "errno" dans le printf(). Pfff. Quel newbie.
Bon, je rectifie mon code posté au début. En revanche, je garantis que sous Linux Mandriva et Linux Aurox
1) j'ai bien affiché "errno" dans le printf
2) errno change de valeur entre "avant" et "après" le perror() mais pas sous Solaris.
En fait, j'ai découvert ce pb par hasard (comme tous les problèmes). J'avais écrit une fonction qui, quand il y avait un problème, affichait un "perror()" et renvoyait "-1". Et dans la fonction appelante, si la fonction appelée renvoyait "-1", affichait aussi un "perror()".
Et là, à l'exécution, j'ai eu deux messages différents d'où le test présentés en début de topic...
Emmanuel Delahaye a écrit : |
NON, quand-même, ce warning ne PEUT PAS provenir de mon source...
Marsh Posté le 23-02-2007 à 11:10:47
Sve@r a écrit : NON, quand-même, ce warning ne PEUT PAS provenir de mon source... |
Non, problème de copié/collé... Ignore le.
Pour ton problème, ça veut peut être dire que perror() provoque une erreur sur ta machine ou ton système ...
En tout cas, ce n'est pas un problème de C.
Marsh Posté le 23-02-2007 à 15:28:01
man 3 perror :
When a system call fails, it usually returns -1 and sets the variable errno to a value describing what
went wrong. (These values can be found in <errno.h>.) Many library functions do likewise. The function
perror() serves to translate this error code into human-readable form. Note that errno is undefined after
a successful library call: this call may well change this variable, even though it succeeds, for example
because it internally used some other library function that failed. Thus, if a failing call is not imme-
diately followed by a call to perror(), the value of errno should be saved.
Marsh Posté le 23-02-2007 à 15:32:29
Emmanuel Delahaye a écrit : Non, problème de copié/collé... Ignore le. |
C'était juste pour montrer que j'avais examiné tous tes messages d'erreur
Emmanuel Delahaye a écrit : Pour ton problème, ça veut peut être dire que perror() provoque une erreur sur ta machine ou ton système ...En tout cas, ce n'est pas un problème de C. |
Hum, j'ai testé sur 2 machines différentes avec 2 distrib différentes et pour moi, c'est un problème de la libc. Je vais quand-même aller vérifier les versions de la libc sur chacune des 2 machines et reviendrai les afficher ici. Mais j'aimerais bien qu'un autre forumeur tournant lui aussi sur une distrib Linux puisse tester et donner son résultat...
Marsh Posté le 23-02-2007 à 17:25:43
Code :
|
|
|
|
Marsh Posté le 23-02-2007 à 19:22:50
Ah, chez moi c'est légèrement différent
errno = 1 |
gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21) |
Marsh Posté le 23-02-2007 à 19:33:37
_darkalt3_ a écrit : [code]
|
Doh ! emerge --sync && emerge system
Marsh Posté le 23-02-2007 à 22:30:09
++fab a écrit : Doh ! emerge --sync && emerge system |
aha je savais qu'on me ferait cette remarque
Ouais, ma gentoo est pas à jour
Marsh Posté le 22-02-2007 à 09:54:47
Un truc que j'arrive pas à comprendre. A moins que je ne fasse erreur, il semble que "perror()" modifie errno !!!
Voici mon code
Exécution: J'ai d'abord "errno=5" puis ensuite j'ai "errno=29" ???
Ce code a été testé sur Mandriva 2006
Message édité par Sve@r le 23-02-2007 à 09:53:02
---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.