Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* Programme qui
- - initialise les ressources necessaires
- - lance les programmes
- - gere les differentes Borne
- - ...
- In.Pr.E.S.
- Controle.c
- */
- #include <stdio.h>
- #include <stdlib.h>
- #include <unistd.h>
- #include <signal.h>
- #include <errno.h>
- #include <sys/ipc.h>
- #include <sys/msg.h>
- #include "fctTrace.h"
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <fcntl.h>
- #define PROCESS "Controle"
- #define IDQ (key_t)1909
- #define IDQ_2 (key_t)1709
- #include "Commun.dat"
- #include "Donnee.dat"
- MESSAGE MessageLu;
- //#include "fichier.ini"
- void Handler(int);
- void Sortie(int);
- int idQ,idQ2;
- int main()
- {
- struct sigaction Action;
- int idChemin,rc,compteur = 0,i=0,IdGroupe;
- char szQueue[10];
- pid_t idPid;
- /* # Redirection */
- int desc;
- if((desc = open("Trace.log", O_RDWR | O_CREAT, 0644)) == -1)
- {
- TraceErr(__LINE__,__FILE__,"Erreur de Redirection");
- exit(1);
- }
- dup2(desc,2);
- /* Armement des signaux */
- Trace("(Controle) Armement des signaux...");
- Action.sa_handler = Handler;
- sigemptyset(&Action.sa_mask);
- Action.sa_flags = 0;
- if (sigaction(SIGINT,&Action,NULL) == -1)
- { TraceErr(__LINE__,__FILE__,"Err. de sigaction()");
- exit(1);
- }
- Trace("(Controle) Creation des ressources necessaires...");
- if ((idQ = msgget(IDQ,IPC_CREAT | IPC_EXCL | 0600)) == -1)
- { TraceErr(__LINE__,__FILE__,"Err. de creation de la 1ere queue...\n");
- exit(1);
- }
- Trace("(Controle) Creation file de message OK");
- // initialiser la station .
- // ....
- while (1)
- {
- idPid = 1;
- Trace("(Controle) attend");
- if ((rc = msgrcv(idQ,&MessageLu,sizeof(MESSAGE) - sizeof(long), 0,0)) < 0)
- { TraceErr(__LINE__,__FILE__,"Err. de reception d'un message...");
- Sortie(1);
- }
- switch (MessageLu.Requete)
- { case IDENTIFICATION:
- Trace("(Controle) Demande d'identification");
- //# msgsnd() ....
- if(compteur == 0)
- {
- Trace("(CONTROLE) AVANT - GID = %d\n",(int)getpgrp());
- compteur++;
- IdGroupe = MessageLu.idProcess;
- setpgid(getpid(),IdGroupe); // s'associe au groupe du premier QtMetro
- Trace("(CONTROLE) APRES - GID = %d\n",(int)getpgrp());
- }
- else
- {
- MessageLu.idProcess = IdGroupe;
- }
- MessageLu.Requete = AFFICHEPUB;
- //fflush(stdout);
- Trace("(CONTROLE) Envoie du message");
- if(rc = msgsnd(idQ,&MessageLu,sizeof(MessageLu)- sizeof(long),0) == -1)
- {
- TraceErr(__LINE__,__FILE__,"Err. d'envoi d'un message...");
- Sortie(1);
- }
- Trace("(CONTROLE) Envoie du message OK");
- //MessageLu.Requete = AFFICHEPUB;
- break;
- case RECHERCHE:
- Trace("(Controle) Demande de chemin vers %d",MessageLu.Message[1]);
- if ((idChemin = fork()) == -1)
- { TraceErr(__LINE__,__FILE__,"Err. de fork()");
- Sortie(1);
- }
- if (!idChemin)
- { /* processus fils */
- sprintf(szQueue,"%d",idQ);
- execl("./Chemin","Chemin",szQueue,NULL);
- TraceErr(__LINE__,__FILE__,"Err. de execl du process Chemin");
- }
- MessageLu.lType = idChemin;
- if (msgsnd(idQ,&MessageLu,sizeof(MessageLu) - sizeof(long),0) <0)
- { TraceErr(__LINE__,__FILE__,"Err. de msgsnd()");
- Sortie(1);
- }
- break;
- /*case AFFICHEPUB:
- if(compteur !=0)
- {
- Trace("(Controle) Entree dans AFFICHEPUB");
- if(compteur == 0)
- {
- IdGroupe = getpgrp();
- }
- MessageLu.idProcess = IdGroupe;
- if(rc = msgsnd(idQ,&MessageLu,sizeof(int),0) == -1)
- {
- TraceErr(__LINE__,__FILE__,"Err. d'envoi d'un message...");
- Sortie(1);
- }
- }
- break;
- if(rc = msgsnd(idQ,&MessageLu,sizeof(MessageLu.idProcess)+ sizeof(long),0) == -1)
- {
- TraceErr(__LINE__,__FILE__,"Err. d'envoi d'un message...");
- Sortie(1);
- }*/
- default:
- break;
- }
- }
- }
- void Sortie(int rcSortie)
- {
- if (msgctl(idQ,IPC_RMID,0))
- TraceErr(__LINE__,__FILE__,"Err. de Suppression de IdRq");
- exit(rcSortie);
- }
- void Handler(int Sig)
- {
- Sortie(Sig);
- }
Add Comment
Please, Sign In to add comment