/* * Programme simulant la gestion d'une imprimante * Dans cette version, on a un processus client (imprime4c) qui envoie * ses requetes d'impression a un processus serveur (imprime4s) via un * tube nommé */ #include #include #include #include #include #include #include #include "imprime3.h" 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); } int main(){ char nomFic[TAILLEMAX]; int fdR; int nbRead; printf("Demarrage du serveur charge des impressions\n"); /* Création du tube nommé du serveur */ if (mkfifo(TUBENOMME, S_IRUSR|S_IWUSR) < 0) { if (errno != EEXIST) { perror("mkfifo(tube nommé serveur"); exit(1); } else { printf("%s existe deja : on suppose que c'est un pipe nomme\n", TUBENOMME); printf("et qu'on peut continuer le programme sans probleme\n"); puts(""); } } /* Ouverture de ce tube nommé. NB : On l'ouvre en RDWR et pas en RDONLY, car (cf. Blaess) : si nous ouvrons le client en lecture seule, à chaque fois que le client se termine, la lecture du tube nomme va echouer car le noyau detecte une fermeture de fichier. En demandant un tube en lecture et en ecriture, nous evitons ce genre de situation, car il reste toujours au moins uin descripteur ouvert sur la sortie */ fdR = open(TUBENOMME, O_RDWR); if (fdR == -1) { perror("open(tube nommé)"); exit(-1); } /* Attente des requêtes */ do{ nbRead = read(fdR, nomFic, sizeof(nomFic)); impression(nomFic); if (nbRead != sizeof(nomFic)) { perror("read sur tube nomme NOK"); return EXIT_FAILURE; } }while(1); }