/* * Programme simulant la gestion d'une imprimante * Dans cette version, on a un processus client (imprime5c) qui envoie * ses requetes d'Impression a un processus serveur (imprime5s) via une * zone de memoire partagee et un mecanisme de producteur/consommateur */ #include #include #include #include #include #include #include #include "imprime5.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; int iExtrait = 0; 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 (pour le compte des differents imprime5c) */ shm->iDepot = 0; /* Creation des semaphores (NB : mutex n'est pas utilise par imprime5s, mais imprime5s realise sa creation (et surtout son initialisation) pour ne pas avoir de creations concurrentes par les client */ /* Initialisation des differents 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); /************************/ /* Attente des requêtes */ /************************/ do{ sem_wait(&shm->info_prete); impression(shm->nomFic[iExtrait]); sem_post(&shm->place_dispo); iExtrait = (iExtrait+1) % NBMAXNOMFIC; }while(1); }