Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1832 connectés 

  FORUM HardWare.fr
  Programmation
  C

  errno et perror()

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

errno et perror()

n°1518120
Sve@r
Posté le 22-02-2007 à 09:54:47  profilanswer
 

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.
mood
Publicité
Posté le 22-02-2007 à 09:54:47  profilanswer
 

n°1518154
Elmoricq
Modérateur
Posté le 22-02-2007 à 10:32:27  profilanswer
 

Et un second perror() affiche quelque chose ?

n°1518187
nORKy
Grmmph...
Posté le 22-02-2007 à 11:27:02  profilanswer
 

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
n°1518297
Sve@r
Posté le 22-02-2007 à 13:53:12  profilanswer
 

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.
n°1518613
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-02-2007 à 21:03:56  profilanswer
 

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/
n°1518698
Elmoricq
Modérateur
Posté le 23-02-2007 à 09:37:03  profilanswer
 

Idem ici. Ce qui n'est pas surprenant.

n°1518703
Sve@r
Posté le 23-02-2007 à 09:52:40  profilanswer
 

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.
n°1518757
Emmanuel D​elahaye
C is a sharp tool
Posté le 23-02-2007 à 11:10:47  profilanswer
 

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/
n°1518949
++fab
victime du syndrome IH
Posté le 23-02-2007 à 15:28:01  profilanswer
 

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
n°1518957
Sve@r
Posté le 23-02-2007 à 15:32:29  profilanswer
 

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.
mood
Publicité
Posté le 23-02-2007 à 15:32:29  profilanswer
 

n°1519055
_darkalt3_
Proctopathe
Posté le 23-02-2007 à 17:25:43  profilanswer
 

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
n°1519111
-Opera-
mago spé électricité
Posté le 23-02-2007 à 19:22:50  profilanswer
 

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.
n°1519121
++fab
victime du syndrome IH
Posté le 23-02-2007 à 19:33:37  profilanswer
 

_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  

n°1519212
_darkalt3_
Proctopathe
Posté le 23-02-2007 à 22:30:09  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  errno et perror()

 

Sujets relatifs
conception base de donnees +erreur (errno: 121)SPIP - Erreur système errno 28 !
Connect et Errno se contredisent !mysql_errno & mysqlerror
<sys/mount.h> int mount et errno incomprehensible 
Plus de sujets relatifs à : errno et perror()


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)