Ping pong en C

Résolu
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!
--
Plus t'avance moins vite, moins t'avance plus vite
Configuration: Linux
Firefox 1.0.7

6 réponses

  1. Modérateur
    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
    1. Modérateur
      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
      1. Modérateur
        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
        1. 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
          1. 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
            1. --
              Plus t'avance moins vite, moins t'avance plus vite
              -1