#define _POSIX_C_SOURCE 200112L #include #include #include #include #include #include #include "err.h" /*------------------------------------------------------------------. | Crée un anneau de processus exécutant. Chaque processus exécute | | ensuite l'algorithme d'élection Dolev-Klawe-Rodeh. L'identité | | des processus utilisée par l'algorithme DKR sera leur pid. | | | | Inconvénient : les pid se suivent. L'anneau aura une numérotation | | croissante. | | | | Exercice: lancer DKR pour le processus i par | | | | execlp ("./DKR", "DKR", identite, NULL);, | | | | où identite aura été générée de façon aléatoire, en garantissant | | que 2 processus différents ont des identités différentes. | `------------------------------------------------------------------*/ void anneau(int n) { int tubes[n][2]; for (int i = 0; i < n; ++i) if (pipe(tubes[i]) < 0) FATAL("pipe"); for (int i = 0; i < n; ++i) { switch(fork()) { case -1: FATAL("fork"); case 0: dup2(tubes[(i-1+n)%n][0], STDIN_FILENO); dup2(tubes[i][1], STDOUT_FILENO); fprintf(stderr, "Tube%d => Proc[i=%d, pid=%d] => Tube%d\n", (i-1+n)%n, i, getpid(), i); for (int j=0; j < n; j++) { close(tubes[j][0]); close(tubes[j][1]); } execlp("./DKR", "DKR", NULL); FATAL("execlp"); default: continue; } } } int main(int argc, char **argv) { if (argc != 2) { fprintf(stderr, "Usage: %s \n", argv[0]); return EXIT_FAILURE; } anneau(atoi(argv[1])); while(wait(NULL)) ; return EXIT_SUCCESS; }