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 :
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 #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
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 // 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);
Merci d'avance pour votre aide, j'espèer avoir été assez claire.
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); } } }
Partager