Ping pong en C

Résolu/Fermé
blackdam Messages postés 327 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 13 février 2015 - 13 juin 2007 à 10:46
mamiemando Messages postés 33443 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 décembre 2024 - 14 juin 2007 à 19:17
Kikoo, c'est encore moi :p
Voilà, toujours avec l'envoi de signaux, je dois créer un genre de "ping pong" en C
En fait, on a un programme père, qui se créer un fils, et joue au ping pong avec lui
Détails du programme :
le père dis au fils de commencer
le fils envoi la balle (affichage de "ping" en fait)
donc le père attends l'envoi du fils, et renvoi à nouveau la balle (affichage de "pong")
le programme s'arrete après 10 échanges.
Pourriez vous m'aider sur les envois de signaux, si ce n'est pas trop demandé?
Merci bocoup d'avance!

6 réponses

mamiemando Messages postés 33443 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 décembre 2024 7 811
14 juin 2007 à 19:17
Puisque tu as coché le sujet et résolu, peux tu donner le code final afin d'en faire profiter les personnes qui passeront sur ce post ?
2
mamiemando Messages postés 33443 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 décembre 2024 7 811
13 juin 2007 à 18:10
Pour moi ça se fait à base de "fork+pipe" ou de "popen" mais c'est assez lointain.
Dans un premier jet tu peux regarder l'aide en tapant dans une console linux ou dans google
man popen
man pipe
man fork

Quelques liens intéressants :
http://www.gidforums.com/t-3369.html
http://web.umr.edu/~ercal/284/PipeExamples/Pipe2.c

Bonne chance
1
mamiemando Messages postés 33443 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 19 décembre 2024 7 811
14 juin 2007 à 10:04
Si tu regardes le deuxième lien (voici la version légèrement corrigée)
#define MSGSIZE 32

char *msg1 = "hello #1";
char *msg2 = "hello #2";
char *msg3 = "hello #3";

int main()
{  char inbuf[MSGSIZE];

    int p[2], j, pid;

    /* open pipe */

    if(pipe(p) == -1)
    {    perror("pipe call error");
        return 1;
    }

    switch(pid = fork()){
        case -1: perror("error: fork call");
                 return 2;

        case 0:  /* if child then write down pipe */
                 close(p[0]);  /* first close the read end of the pipe */
                 write(p[1], msg1, MSGSIZE);
                 write(p[1], msg2, MSGSIZE);
                 write(p[1], msg3, MSGSIZE);
                 break;
        default:   /* parent reads pipe */
                 close(p[1]);  /* first close the write end of the pipe */
                 for(j=0; j<3; j++)
                 {   read(p[0], inbuf, MSGSIZE);
                     printf("Parent: %s\n", inbuf);
                 }
                 wait(NULL);
    }
    return 0;
}

... tu as déjà le premier ping-pong (communication du fils vers le père). Il faut juste que le père communique au fils via un autre pipe qu'il a reçu le message. Le fils doit simplement attendre cet acquittement avant d'émettre un nouveau message.

Bonne chance
1
blackdam Messages postés 327 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 13 février 2015 35
14 juin 2007 à 10:53
Merci mamimando!! J'ai un dernier truc à savoir, en fait j'ai le corps du programme, et je dois absolument utiliser l'envoi de signaux...
voici le code:
#include <sys/types.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include<signal.h>

void execfils(int n){
		printf("ping!!!\n");
}

int main(int argc, char**argv) {

	//déclaration des variables
	pid_t pid,fils; 
	int balle=0,pg=0,balle2=0,i=2;

	printf("Allez mon fils commence!!\n");
	getchar();	

	//création du fils joueur
	pid = fork();

	//execution du fils joueur
	if (pid == 0) { 
			while(balle2<9){	
			//on récéptionne le signal du père
			//on réarme le signal
			//on envoie le signal au père
			balle++;
			}
			}

	//execution du pere joueur
	else if (pid != -1) { 
			
			//création du supporter
			fils=fork();
			if(fils==0){
				while(balle<10){
				printf("Je suis %d ; Vas-y papa!!\n",getpid());
				sleep(2);
				}
			}
			else{
				while(balle<10){
					//on envoi le signal au fils
					//on attends le nouveau signal du fils
					//on réarme le signal
					balle++;
					}
					
					//le père a perdu, il tue ses fils!
					if(balle==10){
						printf("merdeuh j'ai perdu!!!!\n");
						kill(fils,9);
						kill(pid,9);
						}
					}
			}
		
	exit(0);
}

maintenant, il faut que que je remplace les commentaires par le code d'envoi et de récéption de signaux..plus que ça!!
S'il vous plaiiiiiiiiit!!!!!!
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
blackdam Messages postés 327 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 13 février 2015 35
14 juin 2007 à 08:12
Oui merci je vais me pencher sur le fork+pipe, je vais voir quelques tutos sur internet, en attendant si quelqu'un peux encore m'aider je ne dis pas non!! ;)
0
blackdam Messages postés 327 Date d'inscription lundi 19 février 2007 Statut Membre Dernière intervention 13 février 2015 35
14 juin 2007 à 15:32
--
Plus t'avance moins vite, moins t'avance plus vite
-1