/*********************************************************************** * Code contenant les fonctions qui doivent etre adaptees par * * l'etudiant pour son TP note * ***********************************************************************/ #include #include #include #include #include #include #include #include #include void handle_connection (int connection_fd); void *thread_gestion_connexion_entrante(void *arg); void *thread_gestion_sauvegarde(void *arg); #define NOMFICHIER "./sauvegardeCompteurReponse" #define NBTHREADSDANSPOOL 20 /*************************************/ /* Definition des variables globales */ /*************************************/ int compteurReponse; pthread_mutex_t mutex; int fd; int descfich[2]; /********************************************/ /* Procedures appelees par le reste du code */ /********************************************/ /* Procedure chargee de toutes les initialisations specifiques au code de l'etudiant */ void init(){ pthread_t thread; int rc; int i; /* Initialisation de compteurReponse. On essaye d'ouvrir le fichier (avec */ /* l'option O_SYNC pour que l'ecriture se fasse au plus tot sur disque et */ /* qu'on perde donc le moins d'increments de compteurReponse possible en */ /* cas de panne) */ fd = open(NOMFICHIER, O_RDWR|O_SYNC, 0); if (fd < 0){ if (errno == ENOENT){ /* Le fichier n'existe pas : on le cree donc (meme argument que precedemment */ /* pour O_SYNC) */ fd = open(NOMFICHIER, O_CREAT|O_RDWR|O_SYNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); if (fd < 0){ perror("open fichier"); exit(EXIT_FAILURE); } /* Le fichier venant d'etre cree, compteurReponse vaut forcement 0 */ compteurReponse = 0; }else{ perror("open fichier2"); exit(EXIT_FAILURE); } }else{ /* Pas d'erreur a l'ouverture du fichier : on recupere donc la valeur de */ /* compteurReponse */ if (read(fd, &compteurReponse, sizeof(compteurReponse)) != sizeof(compteurReponse)){ perror("Pb lors de l'initialisation de compteurReponse"); exit(EXIT_FAILURE); } } /* Initialisation de mutex */ if (pthread_mutex_init(&mutex, NULL) != 0){ perror("pthread_mutex_init"); exit(EXIT_FAILURE); } /* Demarrage de la thread chargee de faire les sauvegardes */ /* NB : Inutile de detacher ce thread, vu qu'il tournera eternellement */ /* (plus precisement jusqu'a la mort du processus) */ rc = pthread_create(&thread, NULL, thread_gestion_sauvegarde, NULL); if (rc < 0){ perror("pthread_create"); exit(EXIT_FAILURE); } /* Creation du tube sur lequel attendront les NBTHREADSDANSPOOL threads */ /* du pool */ if (pipe(descfich) != 0){ perror("pipe"); exit(EXIT_FAILURE); } /* Creation des NBTHREADSDANSPOOL threads du pool */ for (i=0; i