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

  • Votes
  • Date
  • Date décroissante
  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 ?
    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. 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!! ;)
        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. 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!!!!!!