Voici le sujet :
L'objectif est la simulation d'une partie de Ping-Pong entre deux joueurs représentés chacun par un processus.
1- Écrire trois processus : 2 joueurs et un arbitre. Ces processus communiqueront par tube. Le premier joueur écrira ping et le second pong. Vous injecterez un temps d'attente aléatoire dans le fonctionnement des joueurs avant chaque écriture dans le tube.
L'arbitre lira dans le tube et vérifiera l'alternance des ping et des pong. Si 2 ping apparaissent en suivant, c'est le joueur ping qui gagne le point. On ne se préocupera pas de qui engage (ce sera le premier processus qui écrit).
C'est l'arbitre qui notifie les joueurs de la fin du match en leur demandant de se tuer.
2- Modifier votre programme pour en faire 2 séparés. Un pour les joueurs (ce programme sera lancé 2 fois) et un pour l'arbitre.
3- Écrire un troisième programme qui permettra de lancer les 2 joueurs et l'arbitre par l'utilisation d'une primitive de recouvrement.
4- Question subsidiaire. Modifier l'un de vos programmes pour prendre en compte la notion d'engagement, c'est à dire que les joueurs ne joueront que quand l'arbitre leur signale.
Mais je bloque dès la remière question car mon code (qui n'est pas encore finis) ne compile pas à cause de la fonction strcpy. Voici mon code :
Merci d'avance pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 #include <stdio.h> #include <stdlib.h> #include <sys/types.h> #include <errno.h> #include <signal.h> #include <time.h> #include <stdbool.h> bool ping1 = false; bool ping2 = false; bool pong1 = false; bool pong2 = false; bool finpartie = false; void handlerj1() { printf("Le joueur 1 à gagné"); } void handlerj2() { printf("Le joueur 2 à gagné"); } void handlerfin() { printf("fin de partie"); } int main() { char p[2][5]; srand(time(NULL)); int alea = rand() % 5 + 1; sleep(1); int alea2 = rand() % 5 + 1; pid_t joueur1, joueur2; do { joueur1 = fork(); } while (joueur1 == -1 && errno == EAGAIN); if (joueur1 == 0) { //code joueur1 while (ping2 == false) { sleep(alea); if (strcmp(p[0], "ping") == 0) { strcpy(p[1], "ping"); ping2 = true; printf("ping"); } else { strcpy(p[0], "ping"); ping1 = true; pong1 = false; printf("ping"); } } } else { do { joueur2 = fork(); } while (joueur2 == -1 && errno == EAGAIN); if (joueur2 == 0) { //code joueur2 while (pong2 == false) { sleep(alea2); if (strcmp(p[0], "pong") == 0) { strcpy(p[1], "pong"); pong2 = true; printf("pong"); } else { strcpy(p[0], "pong"); pong1 = true; ping1 = false; printf("pong"); } } } else { //code arbitre } } return 0; }
Partager