Esempio n. 1
0
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;
}
Esempio n. 2
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);
}
Esempio n. 3
0
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;
		}
	}
}