Gentoo Forums
Gentoo Forums
Gentoo Forums
Quick Search: in
[gcc] Problème file de messages avec gcc 4.1 mais pas 3.x
View unanswered posts
View posts from last 24 hours

 
Reply to topic    Gentoo Forums Forum Index French
View previous topic :: View next topic  
Author Message
Aesthetics
Tux's lil' helper
Tux's lil' helper


Joined: 12 Mar 2004
Posts: 91

PostPosted: Sat May 19, 2007 5:25 pm    Post subject: [gcc] Problème file de messages avec gcc 4.1 mais pas 3.x Reply with quote

Bonjour,

voilà en voulant utiliser ce code basique sur les fils de message, je me suis rendu compte que ça ne fonctionne que si je compile avec gcc 3 et pas le 4. Avec le 4 il reste bloqué sur le serveur et rien ne se passe (il affiche meme pas un printf placé au tout début)

Voilà le code serveur :
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct {
   long type;
   char texte[512];
} message_t;

int main(int argc, char *argv[]) {
   key_t key;
   message_t message;
   int file;
   /* int f_theme;

   if((ftheme = open("fichtheme", O_RDWR|O_CREAT,0766)) == -1) {
            perror("open");
            exit(EXIT_FAILURE);
       }
*/
   if ((key=ftok("/home",0)) == -1) {
      perror("Erreur clé");
      exit(EXIT_FAILURE);
   }

   if ((file = msgget(key,IPC_CREAT | 0600)) == -1) {
      perror("msgget");
      exit(EXIT_FAILURE);
   }   

   if (msgrcv(file,(void *)&message,512,1,0) >= 0)
      fprintf(stdout,"(%ld) %s \n",message.type,message.texte);
   else
      perror("msgrcv");

return EXIT_SUCCESS;
}


voilà le code client :
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct {
   long type;
   char texte[512];
} message_t;

int main(int argc, char *argv[]) {
key_t key;
message_t message;
int file;

if ((key=ftok("/home",0)) == -1) {
   perror("Erreur clé");
   exit(EXIT_FAILURE);
}

if ((sscanf(argv[1],"%ld",&(message.type)) != 1) || (message.type <= 0)) {
   fprintf(stderr,"Type invalide");
   exit(EXIT_FAILURE);
}

strncpy(message.texte,argv[2],511);
message.texte[512] = '\0';

if ((file = msgget(key,IPC_CREAT | 0600)) == -1) {
   perror("msgget");
   exit(EXIT_FAILURE);
}

if (msgsnd(file,(void *)&message,512,0) < 0) {
   perror("msgsnd");
   exit(EXIT_FAILURE);
}

return EXIT_SUCCESS;
}   

J'ai testé sur une ubuntu avec gcc 4.1.2 (donc la meme que gentoo) et ça marche par contre...

Pour utiliser faut faire ./client 1 "message"
et ./server pour récupérer le message dans la file

Savez-vous d'où peut venir le problème?

merci
Back to top
View user's profile Send private message
VisualStation
Tux's lil' helper
Tux's lil' helper


Joined: 30 Sep 2006
Posts: 106
Location: Un coin perdu ...

PostPosted: Sat May 19, 2007 6:34 pm    Post subject: Reply with quote

Petite correction, pour ouvrir une file existante : msgget(key_t,0);
Code du Serveur :
Pour le lancer ./serveur
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct {
   long type;
   char texte[512];
} message_t;

int main(int argc, char *argv[]) {
   key_t key;
    message_t message;
   int file,Sortie;

   if ((key=ftok("/home",0)) == -1) {
      perror("Erreur clé");
      exit(EXIT_FAILURE);
   }

   if ((file = msgget(key,IPC_CREAT | IPC_EXCL | 0600)) == -1) {
      perror("msgget");
      exit(EXIT_FAILURE);
   }

   printf("PID Message Queue : %d\n",file);
   
   Sortie=0;
   while(!Sortie){
      if (msgrcv(file,(void *)&message,512,1,0) >= 0){
         fprintf(stdout,"(%ld) %s \n",message.type,message.texte);
         Sortie=1;
      }
      else{
         perror("msgrcv");
      }
      sleep(1);
   }
   
   /*
    * On est propre,
    * on supprime la file de Message
    * sinon ipcrm -q PID_File
    */

   msgctl(file,IPC_RMID,0);

   return EXIT_SUCCESS;
}


Code Client :
./client PID_File Message
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct {
   long type;
   char texte[512];
} message_t;

int main(int argc, char *argv[]) {
   key_t key;
   message_t message;
   int file;

   if(argc!=3){
      printf(" ./Client PID_MsgQ Message\n");
   }
   
   if ((key=ftok("/home",0)) == -1) {
      perror("Erreur clé");
      exit(EXIT_FAILURE);
   }

   file=msgget(key,0);

   message.type=atoi(argv[1]);

   strncpy(message.texte,argv[2],511);
   message.texte[512] = '\0';
   
   if (msgsnd(file,(void *)&message,512,0) < 0) {
      perror("msgsnd");
      exit(EXIT_FAILURE);
   }

   return EXIT_SUCCESS;
}


Tu bloques car ta file de message existe déja !

Edition :
Creer & Ouvrir : msgget(key_t, IPC_CREAT | IPC_EXCL | 0600);
Ouvrir : msgget(key_t,0);

Fonctionne sur Gentoo :).
Bon Amusement avec le C.
_________________
- Own Website -
Gentoo ~x86 on Amilo M3438G, P4 2ghz and x86-64 on Dell Xps 1330
Back to top
View user's profile Send private message
Aesthetics
Tux's lil' helper
Tux's lil' helper


Joined: 12 Mar 2004
Posts: 91

PostPosted: Sun May 20, 2007 2:36 pm    Post subject: Reply with quote

merci je vais tester ça de suite. Et dire que c'est un exemple tiré d'un bouquin :(
Back to top
View user's profile Send private message
VisualStation
Tux's lil' helper
Tux's lil' helper


Joined: 30 Sep 2006
Posts: 106
Location: Un coin perdu ...

PostPosted: Sun May 20, 2007 6:50 pm    Post subject: Reply with quote

Aesthetics wrote:
merci je vais tester ça de suite. Et dire que c'est un exemple tiré d'un bouquin :(


omme quoi le man est plus simple que les bouquins :D
_________________
- Own Website -
Gentoo ~x86 on Amilo M3438G, P4 2ghz and x86-64 on Dell Xps 1330
Back to top
View user's profile Send private message
Display posts from previous:   
Reply to topic    Gentoo Forums Forum Index French All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum