/* * Programme simulant la gestion d'une imprimante * Dans cette version, on a un processus client (imprime6c) qui envoie * ses requetes d'Impression a un processus serveur (imprime6s) via une * zone de memoire partagee et un mecanisme de producteur/consommateur * De plus, imprime6l est en mesure de lire le contenu du tampon de * la zone de memoire partagee pour afficher les travaux en attente */ #include #include #include #include #include #include #include #include "imprime6.h" /* Memoire partagee */ shm_t *shm; /* Code d'impression */ void impression(char *nomFic){ printf("Debut d'impression de \"%s\"...\n", nomFic); sleep(5); /* Simule la lenteur de l'impression */ printf("...Fin d'impression de \"%s\"...\n", nomFic); } /* Programme pricipal */ int main(){ int fd; int retour; printf("Demarrage du serveur charge des impressions\n"); /******************/ /* Initialisation */ /******************/ /* Creation de la mémoire partagee */ fd = shm_open(CLE_SHM, O_CREAT|O_RDWR, 0666); assert(fd>=0); assert(ftruncate(fd, sizeof(shm_t)) >= 0); shm = mmap(NULL, sizeof(shm_t), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); assert(shm>=0); /* Initialisation de iDepot, iRetrait et nbLec */ shm->iDepot = 0; shm->iExtrait = 0; shm->nbLec = 0; /* Initialisation des semaphores */ retour = sem_init(&shm->info_prete, 1, 0); assert(retour != -1); retour = sem_init(&shm->place_dispo, 1, NBMAXNOMFIC); assert(retour != -1); retour = sem_init(&shm->mutex, 1, 1); assert(retour != -1); retour = sem_init(&shm->fifo, 1, 1); assert(retour != -1); retour = sem_init(&shm->mutexl, 1, 1); assert(retour != -1); retour = sem_init(&shm->mutexg, 1, 1); assert(retour != -1); /************************/ /* Attente des requêtes */ /************************/ do{ sem_wait(&shm->info_prete); impression(shm->nomFic[shm->iExtrait]); sem_wait(&shm->fifo); sem_wait(&shm->mutexg); sem_post(&shm->fifo); sem_post(&shm->place_dispo); shm->iExtrait = (shm->iExtrait+1) % NBMAXNOMFIC; sem_post(&shm->mutexg); }while(1); }