problème mmap avec un deamon [résolu]

problème mmap avec un deamon [résolu] - C - Programmation

Marsh Posté le 05-02-2007 à 11:00:02    

voici un code qui map un fichier en mémoire :

Code :
  1. char *do_redirect(void)
  2. {
  3.   static char *buff = NULL;
  4.   char  *s;
  5.  
  6.   if (buff == NULL) {
  7.     int fd;
  8.     struct stat stat;
  9.   syslog(LOG_INFO, "Reading redirect.html..." );
  10.     fd = open("./redirect.html", O_RDONLY);
  11.     fstat(fd, &stat);
  12.     syslog(LOG_INFO, "mapping redirect.html..." );
  13.     buff = mmap(0, stat.st_size, PROT_READ, MAP_SHARED, fd, 0);
  14.     syslog(LOG_INFO, "closing..." );
  15.     close(fd);
  16.   }
  17.   syslog(LOG_INFO, "Sending redirect.html..." );
  18.   s = strdup(buff);
  19.   syslog(LOG_INFO, "dupping..." );
  20.   return (s);
  21. }


 
Ce code est dans une application qui se met en deamon (avec la fonction deamon).
Lorsque l'application N'EST PAS en deamon, aucun problème.
Par contre, si je la mets en deamon, mon application à l'air de s'arrete au niveau de mon strdup (le log "dupping..." n'apparait pas et l'application n'est en mémoire)
Quelqu'un a t-il une explication ? Cela viendrait-il de mon mmap ??
Merci


Message édité par nORKy le 05-02-2007 à 11:03:05
Reply

Marsh Posté le 05-02-2007 à 11:00:02   

Reply

Marsh Posté le 05-02-2007 à 11:02:38    

Lol, mais quel bétise !!!
Il ne faut pas faire de open avec un chemin relatif avec un deamon ! Mais en absolu !!!
Désolé de la polution
 
[:azka]


Message édité par nORKy le 05-02-2007 à 11:04:45
Reply

Marsh Posté le 05-02-2007 à 12:29:49    

s = strdup(buff);
 
bonjour l'overflow ...

Reply

Marsh Posté le 05-02-2007 à 19:35:52    

Taz a écrit :

s = strdup(buff);
 
bonjour l'overflow ...


 
explique au lieu de te moqué.
 
Il n'y a pas de \0 à la fin de la zone mappé par mmap ?

Reply

Marsh Posté le 05-02-2007 à 19:56:43    

T'as pas l'impression de pas allouer s du tout ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 05-02-2007 à 22:55:30    

nORKy a écrit :

explique au lieu de te moqué.
 
Il n'y a pas de \0 à la fin de la zone mappé par mmap ?


pourquoi y en aurait-il ?

Reply

Marsh Posté le 05-02-2007 à 23:56:10    

0x90 a écrit :

T'as pas l'impression de pas allouer s du tout ?


a condition que l'adresse passée en paramètre soit celle d'une chaine C valide, ce code est correct.
 
strdup() (POSIX.1) fait une allocation dynamique de type malloc()  (a libérer par free()).


---------------
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 06-02-2007 à 01:06:42    

Emmanuel Delahaye a écrit :

a condition que l'adresse passée en paramètre soit celle d'une chaine C valide, ce code est correct.
 
strdup() (POSIX.1) fait une allocation dynamique de type malloc()  (a libérer par free()).


 
Oops, lut trop vite, confondu avec strcpy (la faute à strdupa en fait, et spa la première fois...)


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 06-02-2007 à 10:30:39    

Taz a écrit :

pourquoi y en aurait-il ?


 
Parce que mon fichier a peu de chance de tomber sur un multiple de la taille d'une page.
Et que par concéquant, le 'reste' est remplit automatiquement par des 0.

Reply

Marsh Posté le 06-02-2007 à 11:56:59    

...

Reply

Marsh Posté le 06-02-2007 à 11:56:59   

Reply

Marsh Posté le 06-02-2007 à 12:51:44    

nORKy a écrit :

Parce que mon fichier a peu de chance de tomber sur un multiple de la taille d'une page.
Et que par concéquant, le 'reste' est remplit automatiquement par des 0.


Plutôt hasardeux comme méthode, non ?
 


---------------
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 06-02-2007 à 13:03:05    

et pour parler de la fonction de ce code, je n'y vois aucun intérêt. Dans ton cas tu ferais mieux de stocker statiquement une fois pour toutes le contenu du fichier ou bien de le relire systématiquement. Parce que là, ton mmap est simplement incapable de détecter un changement de taille de fichier. Et si le fichier est remplacé, c'est foutu, tu dois redémarrer ton application. Et pour quels gains de performance toutes façons ? ...

Reply

Marsh Posté le 06-02-2007 à 13:11:15    

nORKy a écrit :

Et que par concéquant, le 'reste' est remplit automatiquement par des 0.


 
 [:le poney de mr pink]


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

Marsh Posté le 07-02-2007 à 11:50:01    

Messieurs, plutôt que de jouer les experts critiqueur, vous devriez peût être vous demandez ce que je cherche à faire.
 
Est-ce que j'ai écris quelque part que ce fichier serait modifié (PROT_READ devrait vous aiguillez) ? Est-ce que j'ai dit à quoi il servait ? Est-ce que j'ai dit ca taille ?
De plus, le fichier est stocké statiquement contrairement à ce que vous dites
Donc, mon post est résolu, j'aimerais que vous arretiez les critiques non fondées.

Reply

Marsh Posté le 07-02-2007 à 15:44:30    

ca ne pas répond à mes questions.
 
Mais bon, si t'es content avec ta daube, très bien.

Reply

Sujets relatifs:

Leave a Replay

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