errno et perror()

errno et perror() - C - Programmation

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

Code :
  1. #include <stdio.h>
  2. #include <errno.h>
  3. int main()
  4. {
  5.     errno=5;
  6.     printf("errno=%d\n"; errno);
  7.     perror("essai" );
  8.     printf("errno=%d\n", errno);
  9.     return 0;
  10. }


 
Exécution: J'ai d'abord "errno=5" puis ensuite j'ai "errno=29" ???
 
Ce code a été testé sur Mandriva 2006

Message cité 1 fois
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.
Reply

Marsh Posté le 22-02-2007 à 09:54:47   

Reply

Marsh Posté le 22-02-2007 à 10:32:27    

Et un second perror() affiche quelque chose ?

Reply

Marsh 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 :
  1. 5 EIO Input/output error.  Some physical input or output error occurred.
  2.              This error will not be reported until a subsequent operation on
  3.              the same file descriptor and may be lost (over written) by any
  4.              subsequent errors.
  5. 29 ESPIPE Illegal seek.  An lseek(2) system call was issued on a socket,
  6.              pipe or FIFO.


 
EDIt : Je n'ai pas vu que tu affectais errno..

Message cité 1 fois
Message édité par nORKy le 22-02-2007 à 11:30:52
Reply

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.


Message édité par Sve@r le 22-02-2007 à 18:10:07

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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 !!!
 
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


Y're kidding aren't ya ?


Project   : Forums
Compiler  : GNU GCC Compiler (called directly)
Directory : C:\dev\forums2\
--------------------------------------------------------------------------------
Switching to target: default
Compiling: main.c
main.c:4: warning: function declaration isn't a prototype
main.c: In function `main':
main.c:6: warning: too few arguments for format
main.c:8: warning: too few arguments for format
main.c:10:2: warning: no newline at end of file
Linking console executable: console.exe
Process terminated with status 0 (0 minutes, 4 seconds)
0 errors, 4 warnings


 
errno=1313279886
essai: Input/output error
errno=1313279886
 
Press ENTER to continue.


Code :
  1. #include <stdio.h>
  2. #include <errno.h>
  3. int main(void)
  4. {
  5.     errno=5;
  6.     printf("errno=%d\n", errno);
  7.     perror("essai" );
  8.     printf("errno=%d\n", errno);
  9.     return 0;
  10. }


errno=5
essai: Input/output error
errno=5
 
Press ENTER to continue.

Message cité 1 fois
Message édité par Emmanuel Delahaye le 22-02-2007 à 21:06:09

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-02-2007 à 09:37:03    

Idem ici. Ce qui n'est pas surprenant.

Reply

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 :


...
main.c:10:2: warning: no newline at end of file
...


 
NON, quand-même, ce warning ne PEUT PAS provenir de mon source...

Message cité 1 fois
Message édité par Sve@r le 23-02-2007 à 09:56:43

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

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.

 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 23-02-2007 à 11:13:29

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.


Message édité par ++fab le 23-02-2007 à 15:28:34
Reply

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...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 23-02-2007 à 15:32:29   

Reply

Marsh Posté le 23-02-2007 à 17:25:43    

Code :
  1. #include <stdio.h>
  2. #include <errno.h>
  3. int main(void)
  4. {
  5.   errno=5;
  6.   printf("errno=%d\n", errno);
  7.   perror("essai" );
  8.   printf("errno=%d\n", errno);
  9.   return 0;
  10. }
 


alt3@www ~ $ gcc -c -Wall -ansi ./test.c
alt3@www ~ $ gcc -o test ./test.o

 


alt3@www ~ $ ./test
errno=5
essai: Input/output error
errno=29

 


gcc version 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8)

 

[:pingouino]

Message cité 1 fois
Message édité par _darkalt3_ le 23-02-2007 à 17:28:00

---------------
Töp of the plöp
Reply

Marsh Posté le 23-02-2007 à 19:22:50    

Ah, chez moi c'est légèrement différent
 

errno = 1
essai: Operation not permitted
errno = 29


gcc (GCC) 4.1.2 20061115 (prerelease) (Debian 4.1.1-21)
glibc-2.3.6


---------------
You get so used to things the way they are. And I've always been alone. I guess that makes me lonely.
Reply

Marsh Posté le 23-02-2007 à 19:33:37    

_darkalt3_ a écrit :

[code]


gcc version 3.3.6 (Gentoo 3.3.6, ssp-3.3.6-1.0, pie-8.7.8)




Doh ! emerge --sync && emerge system  :o  

Reply

Marsh Posté le 23-02-2007 à 22:30:09    

++fab a écrit :

Doh ! emerge --sync && emerge system  :o


aha je savais qu'on me ferait cette remarque :o
Ouais, ma gentoo est pas à jour :o


---------------
Töp of the plöp
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed