IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

partie de ping pong inter-processus


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    L3 informatique
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : L3 informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut partie de ping pong inter-processus
    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 :
    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;
    }
    Merci d'avance pour votre aide.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Oui ben bonjour à toi aussi.

    Si tu nous avais mis le message d'erreur du compilateur ça aurait aidé. Ou plus simplement si tu l'avais juste lu tu ne serais même pas venu ici !!!

    Rajoute le bon include déclaratif de strcpy et tu n'auras plus de souci à ce niveau.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("Le joueur 2 à gagné");
    Aoutch...

    Vous injecterez un temps d'attente aléatoire dans le fonctionnement des joueurs avant chaque écriture dans le tube.
    Je n'ai pas l'impression que tu mettes la valeur à jour à chaque fois.

    Ton code est globalement très indenté en profondeur, la structure est assez complexe. Tu devrais découper ton code en fonction pour plus de lisibilité et éviter de dupliquer certaines actions. En fait, ton code semble être dédoublé : un if, un else, quasiment la même chose dans chaque branche. Joueur 1, Joueur 2... Au final, c'est pareil, sauf que l'un envoie ping et l'autre envoie pong. Une fonction ou une structure prenant en paramètre cette chaine, hum.... Ca pourrait être pas mal non ?

  4. #4
    Membre averti
    Homme Profil pro
    L3 informatique
    Inscrit en
    Mars 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : L3 informatique

    Informations forums :
    Inscription : Mars 2013
    Messages : 21
    Par défaut
    Mon code compile maintenant mais ne fait pas ce qui est demandé.. Oui, je ne met pas à jour cette valeur, et il est vrai que mon code pourrait être simplifié. Je le simplifie, j'essaie de le modifier puis je vous le reposterais ici.

Discussions similaires

  1. [windows] Communication inter-processus
    Par litbos dans le forum Windows
    Réponses: 6
    Dernier message: 16/01/2007, 09h13
  2. communiaction inter processus
    Par zippo29 dans le forum POSIX
    Réponses: 2
    Dernier message: 14/05/2006, 13h32
  3. [débutant] Communication inter-processus
    Par tooney dans le forum C
    Réponses: 3
    Dernier message: 29/12/2005, 20h48
  4. [TP] Problème dans un jeu de ping pong
    Par kellog02 dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 05/11/2005, 11h41
  5. communication inter-processus
    Par benoit70 dans le forum MFC
    Réponses: 1
    Dernier message: 14/04/2005, 09h55

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo