int main() { char pass[MAX_PASSWORD_SIZE]; int idSemOuverture, idShm, hdServerPid, notConnected, choix; pid_t server_id; do { strcpy(pass, getpass("Mot de passe administrateur: ")); if(notConnected = strcmp(pass, ADMIN_PASSWORD)) { Trace("Mauvais mot de passe."); } } while(notConnected); Trace("\tRecuperation du semaphore 'Ouverture'"); if ((idSemOuverture = semget(SEM_OPEN_KEY, 1, 0)) == -1) { TraceErreur("\tErreur de semget()"); Sortie(1, idShm); } // On sait que le PID est à jour dans le fichier, car l'admin ne se lance pas si le server n'est pas lancé. // Et si le server est lancé, le pid dans le fichier est à jour. Trace("\tRecuperation du pid du serveur"); if ((hdServerPid = open("data/Server.pid", O_RDONLY)) == -1) { TraceErreur("\t(Serveur) Erreur d'ouverture du fichier data/Server.pid"); Sortie(1, idShm); } read(hdServerPid, &server_id, sizeof(pid_t)); close(hdServerPid); Trace("\tCreation d'une memoire partagee"); if ((idShm = shmget(SHARED_MEM_KEY, sizeof(char) * SHARED_MEM_SIZE, IPC_CREAT | IPC_EXCL | 0600)) == 0) { TraceErreur("Erreur de shmget(%d)", errno); Sortie(1, idShm); } while(1) { choix = menu(); switch(choix) { case 0: Sortie(0, idShm); case 1: fermer_bibli(idSemOuverture); break; case 2: ouvrir_bibli(idSemOuverture); break; case 3: broadcast(server_id, idShm); break; } } return 0; }
pid_t GetPidServeur() { int file; pid_t Pid; Pid=getpid(); if((file = open("Serveur.pid",O_RDONLY)) == -1) { TraceErreur("(Serveur) Erreur ouverture Serveur.pid"); Sortie(1); } read(file,&Pid,sizeof(pid_t)); if(close(file)) { TraceErreur("(Serveur) Erreur Fermeture Serveur.pid"); Sortie(1); } return(Pid); }
int main() { int idM=NULL; pid_t PidServeur; char Message[180], *pShm; struct sembuf SemBuff[1]; PidServeur=GetPidServeur(); //Creation memoire partagée if((idM = shmget(CLER,sizeof(Message),IPC_EXCL|IPC_CREAT|0600))==-1) { printf("Erreur de création de mem"); exit(1); } while(1) { switch(Menu()) { case 1://FERMER BIBLIOTHEQUE //initialisation du serveur int idSem; if((idSem = semget(CLES,0,0))==-1) { TraceErreur("Erreur initialisation semaphores"); Sortie(0); } SemBuff[0].sem_num=1; SemBuff[0].sem_op=-1; SemBuff[0].sem_flg=0; if(semop(idSem,SemBuff,1)) { TraceErreur("Erreur operation semaphores1"); Sortie(0); } printf("La Bibliothèque va se fermer\n"); SemBuff[0].sem_num=0; SemBuff[0].sem_op=0; SemBuff[0].sem_flg=0; if(semop(idSem,SemBuff,1)) { TraceErreur("Erreur operation semaphores2"); Sortie(0); } printf("La Bibliothèque est fermée\n"); if(idM!=NULL) shmctl(idM,IPC_RMID,0); kill(PidServeur,SIGINT); //*******Fin Sem********** break; case 2://ENVOYER UN MESSAGE printf("\t (Admin) dans Envoyer message\n"); if((pShm = (char*)shmat(idM,0,0)) == (char *)-1)//Attacher Mémoire partagée printf("(Admin) Erreur shmat"); printf("Entrer le message que vous voulez envoyer:\n"); fflush(stdin); gets(Message); printf("\ngets: %s\n",Message); strcpy(pShm,Message); shmdt(pShm);//Détacher memoire partagée kill(PidServeur,SIGUSR1);// Envoyer signal au serveur break; case 3: if(idM!=NULL)//Effacer Memoire partagée si elle existe { shmctl(idM,IPC_RMID,0); } Sortie(0); break; } } }