Bonsoir à tous,
voilà j'ai un petit problème, j'envoi un message dans une file de message et je n'arrive hélas pas à le récupérer. Pour info voilà mes strcture pours mes files :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#ifndef _TYPE_H_
#define CLE_F1 1664
#define CLE_F2 5151
 
struct file1{ // message allant d'un client vers le serveur ou sous serveur
	long pid_destinataire; // (=1 si destinataire = serveur principal) sinon pid du destinataire 
	int type_question; // 1 = imprimer ,2 = infos ,3 = annuler
	int pid; // pid du processus inserant le message
	char nom_fichier[255]; // nom du fichier
};
 
struct file2 { // message allant du sous serveur vers le client
	long type; // pid du destinataire du message
	long pid_reponse; // pid du processus qui envoi le message
	char rep[255]; // message envoyé (numéro d'impression, information ou annulation...)
};
 
#endif
Voici le bout de code de mon client qui m'intéresse :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
	// Reservation des segments liés à la file de message
	int id_file1 = msgget(CLE_F1 ,IPC_EXCL);
        int id_file2 = msgget(CLE_F2,IPC_EXCL);
 
	if(!strcmp(argv[1],"-p")) {
		file1.pid_destinataire = 1;
		file1.type_question = 1;
		file1.pid = getpid();
		strcpy(file1.nom_fichier,argv[2]);
		// Envoi du message et attente de réception...
		msgsnd(id_file1,&file1,sizeof(struct file1)-sizeof(long),0);
			   printf("BBB\n");	
		msgrcv(id_file2,&file2,sizeof(struct file2)-sizeof(long),getpid(),0);
		// On écrit le fichier dans le repertoire spool/repon.rep
		ecriture(argv[2],atoi(file2.rep));	
		file1.pid_destinataire = file2.pid_reponse; // On envoi dans file1.type le numero du sous serveur qui a envoye le numero d'impression
		file1.type_question = file2.pid_reponse;	
		msgsnd(file1,&file1,sizeof(struct file1)-sizeof(long),0);
et le bout de code du serveur qui m'intéresse, je vous indique l'endroit ou mon processus bloque pour recevoir son message :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 
while (1) {
    msgrcv(id_file1,&file1,sizeof(struct file1)-sizeof(long),1,0);
    if (!fork()) {
       if (file1.type_question == 1) { // On veut lancer un fichier dans la file d'impression
           int next_free; // Variable destiner a recevoir la prochaine place de libre
	   next_free = find_next_number_print();
 
	   etat_impressions[next_free].etat = EN_ATTENTE_COPIE;
	   strcpy(etat_impressions[next_free].nom_fichier,file1.nom_fichier);
 
	   // on met dans la structure file2 tous ce que l'on va renvoyer au client pour qu'il copie le fichier
	   sprintf(file2.rep,"%d",next_free); 
           file2.pid_reponse = getpid();
           file2.type = file1.pid;   
 
	   msgsnd(id_file2,&file2,sizeof(struct file2)-sizeof(long),0);   
 
           // On doit maintenant attendre que le client ai fini de copié.
          // MON PROGRAMME BLOQUE ICI !!!
	   msgrcv(id_file1,&file1,sizeof(struct file1)-sizeof(long),getpid(),0);
 
	   // ajouter les sémaphore pour pas dacces commun a inserer fin file ATENTION  PAS FAIT
	   inserer_fin_file(next_free);
           imprim_file();	
	   imprim_tab();
	   printf("premier element a imprime : %d, dernier : %d, nb element %d",reperage->premier,reperage->dernier,reperage->nb_elements);
       } else if (file1.type_question == 2) {
       } else if (file1.type_question == 3) {
       } else {
          printf("erreur\n");
       }     
    exit(0);
    }
  }
 
}
Merci d'avance pour votre aide, j'espèer avoir été assez claire.