/* * Programme simulant la gestion d'une imprimante * Dans cette version, on forke un enfant qui se charge de toutes les * impressions. Le pere et l'enfant communiquent via un tube. */ #include #include #include #include #include #include int tube[2]; #define TAILLEMAX 80 void impression(){ char nomFic[TAILLEMAX]; printf("Demarrage du fils charge des impressions\n"); do { read(tube[0],nomFic,sizeof(nomFic)); if (strcmp(nomFic,"0") == 0){ break; } printf("Debut d'impression de \"%s\"...\n", nomFic); sleep(5); /* Simule la lenteur de l'impression */ printf("...Fin d'impression de \"%s\"...\n", nomFic); }while (1); printf("Arret du fils charge des impressions\n"); exit(EXIT_SUCCESS); } void attenteImpression(){ char nomFic[TAILLEMAX]; pid_t pid; int status; do { printf("Nom du fichier a imprimer (taper '0' pour terminer) ? "); scanf("%s", nomFic); write(tube[1],nomFic,sizeof(nomFic)); }while (strcmp(nomFic,"0") != 0); pid = wait(&status); if (pid < 0){ perror("wait"); exit (EXIT_FAILURE); } printf("Au revoir\n"); } int main(){ pid_t pid; /* On prepare le tube de communication entre le pere et le fils */ if (pipe(tube)<0) { perror("pipe"); exit(1); } /* On forke le fils qui gerera toutes les impressions */ pid = fork(); switch(pid){ case -1: perror("echec de fork"); exit(EXIT_FAILURE); case 0: /* Enfant */ close(tube[1]); impression(); exit(EXIT_SUCCESS); default: /* parent */ close(tube[0]); break; } /* C'est parti pour les impressions */ attenteImpression(); return EXIT_SUCCESS; }