Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 25/03/2008, à 20:51

_jean_

[Résolu] Illegal Seek/Pb Perror

Bonjour à tous,

Juste un petit code pour écrire dans un fichier et une erreur "lllegal seek" comme résultat !!!

#include "nclude.h"

int main(int argc, char **argv)
{
  int fd,acs;
  char *msg;
  size_t sz;
    
  msg = "coucou";
  fd = open("BITEME", O_CREAT|O_RDWR|O_APPEND, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
  perror("open");
  printf("fd= %d\n", fd);
  acs = access("./BITEME", R_OK|W_OK| X_OK | F_OK);
  perror("access");
  printf("acs : %d\n",acs);
  lseek(fd, 0, SEEK_CUR);
  perror("lseek");
  write(fd, msg, 6);
  perror("pb write");
  close(fd);
  perror("pb close");
  return (0);
}

voilà la trace du prog:

open: Success
fd= 3
access: Illegal seek
acs : 0
lseek: Illegal seek
pb write: Illegal seek
pb close: Illegal seek

et malgré tout le fichier est créé et contient bien le "coucou" !!!!
quelqu'un aurait-il une explication ???
Merci.
Jean.

Dernière modification par _jean_ (Le 27/03/2008, à 11:51)

Hors ligne

#2 Le 25/03/2008, à 21:30

abetsic

Re : [Résolu] Illegal Seek/Pb Perror

Bonsoir,

Une fois que tu as utilisée errno avec un perror() il faut le remettre à zéro (errno=0; suffit).

En l'occurence c'est l'appel à perror qui fait une erreur visiblement, et en fait en lisant la page de man de perror, on s'apperçoit que lire la valeur de errno après un appel système qui a réussi (qui a renvoyé 0 en général) n'a aucun sens puisque ce sont des librairies internes qui ont pu renvoyer une erreur et affecter errno.

#include <stdio.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

int main(int argc, char **argv)
{
  int fd,acs;
  char *msg="coucou";
  size_t sz;

  errno=0;
  fd = open("BITEME", O_CREAT|O_RDWR|O_APPEND, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH|S_IXOTH);
  perror("open");
  perror("perror");
  errno=0;
  printf("fd= %d\n", fd);
  perror("printf");
  errno=0;
  acs = access("./BITEME", R_OK|W_OK| X_OK | F_OK);
  perror("access");
  printf("acs : %d\n",acs);
  errno=0;
  lseek(fd, 0, SEEK_CUR);
  perror("lseek");
  errno=0;
  write(fd, msg, 6);
  perror("pb write");
  errno=0;
  close(fd);
  perror("pb close");
  return (0);
}

Hors ligne

#3 Le 26/03/2008, à 11:13

_jean_

Re : [Résolu] Illegal Seek/Pb Perror

yikes
j'aurai mis un petit bout de temps avant de penser à une erreur venant de perror !!!! Merci beaucoup ! Je vais tester ça ce soir et je rajouterai un petit résolu big_smile
Je comprends mieux maintenant la présence de tests if sur ces fonctions.

Hors ligne