/* * 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 #include #include "imprime5.h" /* Memoire partagee */ shm_t *shm; /* Programme d'attente d'impression */ void attenteImpression(){ int fd; char nomFic[TAILLEMAX]; /******************/ /* Initialisation */ /******************/ /* Recuperation pointeur sur la mémoire partagee (crees par imprime5s) */ fd = shm_open(CLE_SHM, 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); /************************************/ /* C'est parti pour les impressions */ /************************************/ do { printf("Nom du fichier a imprimer (taper '0' pour terminer) ? "); scanf("%s", nomFic); if (strcmp(nomFic,"0") == 0){ break; } /* On ecrit dans le tampon */ sem_wait(&shm->place_dispo); sem_wait(&shm->mutex); strncpy(shm->nomFic[shm->iDepot],nomFic,TAILLEMAX); shm->iDepot = (shm->iDepot + 1) % NBMAXNOMFIC; sem_post(&shm->mutex); sem_post(&shm->info_prete); }while (1); printf("Au revoir\n"); } /* Programme principal */ int main(){ /************************/ /* Attente des requêtes */ /************************/ attenteImpression(); return EXIT_SUCCESS; }