/* * Programme simulant la gestion d'une imprimante * Dans cette version, on forke un enfant a chaque demande d'impression, un * enfant n'imprimant que sil est seul a imprimer (utilisation d'un mutex * pour garantir la section critique */ #include #include #include #include #include #include #include #include sem_t *mutex; void impression(char *nomFic){ sem_wait(mutex); printf("Debut d'impression de \"%s\"...\n", nomFic); sleep(5); /* Simule la lenteur de l'impression */ printf("...Fin d'impression de \"%s\"...\n", nomFic); sem_post(mutex); } void attenteImpression(){ char nomFic[80]; pid_t pid; do { printf("Nom du fichier a imprimer (taper '0' pour terminer) ? "); scanf("%s", nomFic); if (strcmp(nomFic,"0") == 0){ break; } pid = fork(); switch(pid){ case -1: perror("echec de fork"); exit(EXIT_FAILURE); case 0: /* Enfant */ impression(nomFic); exit(EXIT_SUCCESS); default: /* parent */ break; } }while (1); printf("Au revoir\n"); } #define CLE_IMPRESSION "/cle_impression" int main(){ /* Creation du semaphore pour l'exclusion mutuelle entre les fils */ mutex = sem_open(CLE_IMPRESSION, O_CREAT, S_IRWXU, 1); if (mutex == SEM_FAILED) { perror("sem_open"); exit(EXIT_FAILURE); } /* C'est parti pour les impressions */ attenteImpression(); /* fermeture du semaphore */ if( sem_close(mutex) < 0) { perror("sem_close"); exit(EXIT_FAILURE); } /* destruction du semaphore */ if( sem_unlink(CLE_IMPRESSION) < 0) { perror("sem_unlink"); exit(EXIT_FAILURE); } return EXIT_SUCCESS; }