#include #include #include #include #include #include #include #include static int pour = 0; static int contre = 0; static int nb_contrib = 0; sem_t *sem_pour = NULL; sem_t *sem_contre =NULL; sem_t *sem_contrib =NULL; void compte_pour(int signo) { sem_wait(sem_pour); pour++; sem_post(sem_pour); sem_wait(sem_contrib); nb_contrib++; sem_post(sem_contrib); } void compte_contre(int signo) { sem_wait(sem_contre); contre++; sem_post(sem_contre); sem_wait(sem_contrib); nb_contrib++; sem_post(sem_contrib); } void compte_egalite(int signo) { sem_wait(sem_contrib); nb_contrib++; sem_post(sem_contrib); } int main(int argc, char *argv[]){ int nb_workers = atoi(argv[1]); FILE *f = fopen("votes.txt", "r"); fseek (f, 0, SEEK_END); long nb_votes = ftell(f); int chunk = nb_votes / nb_workers; int vote; sem_pour = sem_open("/POUR", O_CREAT, S_IRWXU, 1); sem_unlink("/POUR"); sem_contre = sem_open("/CONTRE", O_CREAT, S_IRWXU, 1); sem_unlink("/CONTRE"); sem_contrib = sem_open("/CONTRIB", O_CREAT, S_IRWXU, 1); sem_unlink("/CONTRIB"); struct sigaction sa1; sa1.sa_handler = compte_pour; sa1.sa_flags = 0; sigaction(SIGUSR1, &sa1, 0); struct sigaction sa2; sa2.sa_handler = compte_contre; sa2.sa_flags = 0; sigaction(SIGUSR2, &sa2, 0); struct sigaction sa3; sa3.sa_handler = compte_egalite; sa3.sa_flags = 0; sigaction(SIGFPE, &sa3, 0); char offset[10]; char chunk_size[10]; char bureau[10]; snprintf(chunk_size, 10, "%d", chunk); snprintf(bureau, 10, "%d", getpid()); for(int i = 0; i < nb_workers ; i++){ snprintf(offset, 10, "%d", i * chunk); pid_t pid = fork(); if(pid == 0){ execl ("./depouilleur", "depouilleur", "votes.txt", offset, chunk_size, bureau, NULL); } } // Traitement du surplus de votes non assignés aux dépouilleurs if (chunk * nb_workers != nb_votes){ int vote; fseek (f, chunk*nb_workers, SEEK_SET); while (fread(&vote, sizeof(char), 1, f) != 0){ if (vote == '1'){ sem_wait(sem_pour); pour++; sem_post(sem_pour); } else{ sem_wait(sem_contre); contre++; sem_wait(sem_contre); } } } // En attente des contributions des dépouilleurs while (nb_contrib != nb_workers) ; if (pour > contre) printf("--> Souhait de revenir en présentiel!\n"); else if( pour == contre) printf("--> Souhait de rester en distanciel!\n"); else printf("--> Résultat mitigé!\n"); return EXIT_SUCCESS; }