j'ai une petite question sur les types de la MSQ.
La MSQ du serveur consultation de clé 17 reçoit un message de type 1 et répond avec le type 1 ?
Pareil en réservation avec MSQ clé 314 et type 2 en émission et réception ?
j'ai une petite question sur les types de la MSQ.
La MSQ du serveur consultation de clé 17 reçoit un message de type 1 et répond avec le type 1 ?
Pareil en réservation avec MSQ clé 314 et type 2 en émission et réception ?
Elle doit répondre avec un autre type pour bien faire la différence entre demande et réponse.Envoyé par clubmed01
Le process qui fait les demandes envoi sa demande avec un message type 1.
Le process chargé de traiter les demandes lit dans la file les message de type 1 ( demande).Puis créer un processus et un tube.
Le process chargé de consulter la mémoire partagée lit dans le tube puis répond dans la file avec un message de type 2 ( réponse).
Le process qui fait les demandes consulte sa réponse dans la file des message de type 2.
Y'a un truc qui cloche ?
J'ai plusieurs difficultés :
1 - l'énoncé dit :" les processus fils du processus serveur Réservation recouvrent le code hérité du père par un code exécutable contenant les actions de réservation".
-> je fais donc appel dans le processus fils à un programme externe consult.exe.
-> j'ai bon ?
2 - Pour consult.exe, là j'ai du mal à mettre en place les différentes primitives concernant la pose du sémaphore, l'attachement à la mémoire, etc... mais je sais que c'est là que je test nb_places <= nb_dispo.
Bon, voici le pseudo-code de ce que j'ai déjà fait :
a - le processus client Consultation :
Main ( )
{
Int msqid ;
Msqid = msgget (17,0)
Requete_cons.letype = 1 ;
Requete_cons.mon_pid = getpid ( ) ;
Msgsnd (msqid , requete_cons , ___ ) ;
Msgrcv (msqid , reponse_cons , getpid ( ) ) :
Exit ( )
}
b - le processus client Réservation :
Main ( )
{
Int msqid ;
Msqid = msgget (314,0)
Requete_resa.letype = 1 ;
Requete_resa.mon_pid = getpid ( ) ;
Msgsnd (msqid , requete_resa , ___ ) ;
Msgrcv (msqid , reponse_resa , getpid ( ) ) :
Exit ( )
}
c- le processus serveur Consultation:
# include …
# define CLE 17
Main ( )
{
Int msqid ;
int tube[2] ;
Pid_t retour ;
Msqid = msgget (17, IPC_CREAT | IPC_EXCL | 0660 )
Msgrcv (msqid , requete_cons , 1 , ___ ) ;
Pipe (tube) ; /* ouverture du tube */
Retour = fork ( ) ;
If (retour == 0)
{ /* LE FILS */
close ( tube [1] ) ; /* pas d’écriture sur le tube */
read ( tube [0] , ……… /* lecture sur le tube */
execl (« /home/steph/applis/consult.exe », « consult.exe », ___ ) ;
msgsnd ( msqid , nb_dispo, ____ ) ; /* envoi résultat de consult.exe */
close ( tube [0] ) ; /* pas de lecture sur le tube */
exit ( ) ;
else
{ /* LE PÈRE */
close ( tube [0] ) ; /* pas de lecture sur le tube */
write( tube [1], requete_cons, ???) /* écriture requete sur le tube */
close ( tube [1] ) ;
wait ( ) ;
}
consult.exe
semget (key_t ,
- Pose d'un sémaphore sur la mémoire partagée.
- Attachement à la mémoire partagée
- Recherche des informations dans la mémoire partagée
- Dépose du sémaphore
- Détachement de la mémoire partagée
a - Pour recouvrir le code il faut utiliser les fonctions execlp, exec,... C'est a priori ce que tu fais.-> je fais donc appel dans le processus fils à un programme externe consult.exe.
-> j'ai bon ?
b-Le code qui est derrière execl ne s'executera jamais sauf si excel échoue, ce que tu ne veux pas. Donc ton envoi dans la file de message dans ce cas ne marchera jamais ( si excelp n'échoue pas).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 /* LE FILS */ close ( tube [1] ) ; /* pas décriture sur le tube */ read ( tube [0] , /* lecture sur le tube */ execl (« /home/steph/applis/consult.exe », « consult.exe », ___ ) ; msgsnd ( msqid , nb_dispo, ____ ) ; /* envoi résultat de consult.exe */ close ( tube [0] ) ; /* pas de lecture sur le tube */ exit ( ) ;
c-Il te faut passer en paramétre à consult.exe le descripteur de lecture. ( Récupérable avec les arguments de main argv)
d-Il te faut déja creer la semaphore et la mémoire partagée. ( semget et shmget, je te laisse regarder les fonctions qui y sont liées pour s'attacher se détacher poser un semaphore..)semget (key_t ,
- Pose d'un sémaphore sur la mémoire partagée.
- Attachement à la mémoire partagée
- Recherche des informations dans la mémoire partagée
- Dépose du sémaphore
- Détachement de la mémoire partagée
e-Pour la recherche d'information il faut utiliser un algo. Je te donne le plus simple.
Lors de l'attachement à une mémoire partagée ( shmat) tu possédes en retour un pointeur sur cette zone.
Il te suffit de parcourir ta mémoire partagée et de tester les conditions.
f-Normalement tu ne devrais qu'avoir une seule file de message. Il me semble que tu en crées 2 toi. La file de message pour le client consultation doit être la même que le processus serveur consultation.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 while ( i < Nb_Element_Memoire_Partagee) if ( P[i].NomChamp == Recherche.NomChamp && P[i].Champ2==Recherche.Champ2) ...
WOUHAOU !
Là ça se gâte, car je n'ai pas vu en cours comment récuperer le résultat d'un exe dans un PS qui l'a lancé ! Dommage, car le sujet nous impose de lancer un exec !
Tu peux me guider un peu plus ?
PS : désolé, mais j'ai rien sur les exec...
No paniqueEnvoyé par clubmed01
![]()
Mais effectivement tu fais un exec dans le code que tu montres.Là ça se gâte, car je n'ai pas vu en cours comment récuperer le résultat d'un exe dans un PS qui l'a lancé ! Dommage, car le sujet nous impose de lancer un exec !
Quel résultat veux-tu récupérer ? Une fois que tu fais un exec le code est recouvert.
exemple :
Tu vois dans cet exemple le printf("bonjour") ne sera jamais executé. En fait le code du processus fils est recouvert ( remplacé, écrasé) par le code du programme "programme".
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 fork(); if ( FILS ){ exec( "programme"); printf("Bonjour") }
Le programme "programme" n'est ni plus ni moins :
Tu vois ce que je veux dire ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part int main(int argv, char **argv ){ return 0 ;}
Tout ce que j'ai :PS : désolé, mais j'ai rien sur les exec...
C'est cela et je peux même pas consulter les sites je suis derriere un websense :o
Bon, et bien là... je vois pas trop... désolé. jusque là j'avançais bien grâce à ton aide, mais j'atteinds mes limites. Moi et la prog, c'est pas vraiment une grnade histoire d'amour.
Je comprends ce que tu veux dire, mais je vois pas bien comment le prog va renvoyer vers le fils le résultat de la consultation ou la réservation.
On n'avait pas dit que c'était le fils qui renvoyait la réponse dans la MSQ pour le client ????
j'ai trouvé un truc qui semble parler de la même chose que toi, mais je comprends pas tout... tu peux décrypter pour moi ?
http://www.lifl.fr/~hauspie/uploads/Hauspie/ds_sys.pdf
[quote="clubmed01"]On n'avait pas dit que c'était le fils qui renvoyait la réponse dans la MSQ pour le client ????
[quote]
Mais si dans le processus fils tu renvoies le resultat dans la file de message où est le probléme ?
Peut être que quelqu'un a suivi est pourra nous éclairer un peu plus tous les deux...
Tu as pas autre chose que du pdf ?j'ai trouvé un truc qui semble parler de la même chose que toi, mais je comprends pas tout... tu peux décrypter pour moi ?
http://www.lifl.fr/~hauspie/uploads/Hauspie/ds_sys.pdf![]()
j'ai transformé chacune des pages en jpg, visibles à l'adresse :
http://s.berquignol.free.fr/ds_sys_Page_1.jpg
http://s.berquignol.free.fr/ds_sys_Page_2.jpg
http://s.berquignol.free.fr/ds_sys_Page_3.jpg
http://s.berquignol.free.fr/ds_sys_Page_4.jpg
http://s.berquignol.free.fr/ds_sys_Page_5.jpg
http://s.berquignol.free.fr/ds_sys_Page_6.jpg
J'en ai aussi fait un fichier texte:
http://s.berquignol.free.fr/ds_sys.txt
J'ai une hypothèse que je souhaite te soumettre :
Lorsqu'on lance l'execl, le reste du code du fils ne va pas s'executer. Il nous reste donc deux programmes indépendants. Le père et le pgm lancé par l'execl. l'execl peut il envoyer directement le résultat de la requête dans la MSQ à destination du client ?
Bon, c'est remis. Merci pour m'avoir guidé tout au long de l'élaboration de ce devoir. je posterai un message avec ma note !!!
Ah ! La blague ! On verra bien.
A bientôt.
Ca marchait au moins ? Tu as eu le temps de faire des tests ?Envoyé par clubmed01
Ca paraît court le temps que l'on te donne quand même 1 semaine pour réaliser tout ? ( conception, programmation et test ?)
Si ça marche ? j'en sais rien. j'ai un mac, et il semblerait que les instructions sur mac osx, ne soient pas les mêmes que sur Linux... pas loin, mais pas les mêmes. En plus, j'ai rien pour essayer.
je m'y mettrai sérieusement quand j'aurai un peu de temps, car j'aimerais bien monter un serveur MAC OSX, et le configurer par lignes de commande. je l'ai installé sur mon mac mini, mais pas le temps, encore, de m'y plonger.
Quant au délai, ça faisait un peu plus de 3 semaines qu'on a vait le sujet, mais manque de temps pour l'étudier, et manque de connaissances en la matière; dès que j'ai eu le temps, je m'y suis mis à fond !
Merci encore une fois pour ton aide et ton soutien. Dans notre "promo", les mecs la jouent un peu perso, alors qu'en principe, même s'il s'agit d'un sujet d'étude personnel, nous devons nous soutenir et nous entraider; suivre une formation d'ingénieur, c'est aussi l'occasion de cultiver l'esprit d'équipe et de cohésion. Charge à chacun d'apporter sa pierre !
Si ça t'intéresse d'avoir mon sujet complet, laisse ton email, et je te l'envoie.
Tu lui as filé quoi a ton professeur les executables les différents projets ?Si ça marche ? j'en sais rien
T'abuses... La prochaine fois on essayera de le faire ensemble si tu veux du début à la fin si cela t'interesses vraiment.

J'ai le même type de projet à faire... apparemment le même sujet sur la réservation et je dois sdire que je ne capte pas grand chose non plus en programmation Unix !
L'UE étant obligatoire, les autres élèves effectivement se la joue perso. Est-ce que vous pourriez m'aider à mon tour sur le projet de réservation ?
Merci
Partager