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 :

lire dans le tube


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 5
    Points
    5
    Par défaut lire dans le tube
    Bonjour,
    j'ai un petit probleme pour lire dans un tube.
    je souhaiterais arriver,dans mon code suivant, à ce que arbitre lira dans le tube et vérifiera l'alternance des ping et des pong si 2ping se suivent l'arbitre devra afficher ping à gagné, mais impossible de coder corectement arbitre. Voilà ce que mon code donne pour le moment

    Merci d'avance.

    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
    #include<stdio.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    #include<signal.h>
     
    int main ()
    {
    	int tube [2];
    	char texte[24];
    	pipe(tube);
    	int i;
    	int status;
    	for (i=1; i<=5; i++)
    {	
    pid_t ping;
    ping=fork();
    if (ping ==0)
    {
    write(tube[1], "ping", 4);
    wait(&status);
    read (tube[0], texte, 8);
    write(STDOUT_FILENO, texte,4);
    }
     
    pid_t pong;
    pong=fork();
    if (pong==0)
    {
    write(tube[1], "pong", 4);
    wait(&status);
    read (tube[0], texte, 8);
    write(STDOUT_FILENO, texte,4);
    }
    i++;
    }
     
    pid_t arbitre;
    arbitre=fork();
    read(tube[1],"pingping", 15);
    if (arbitre==1)
    {
    	printf (" ping à gagné");
    }
    else
    {
    	printf (" pong à gagné");
    }
     
     
    return 0;
    }

  2. #2
    Candidat au Club
    Inscrit en
    Septembre 2009
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Je ne me souviens plus trop comment on fait j'avais fait un truc dans le genre il y a longtemps de mes souvenir tu a besoin des fonctions dup et dup2

    Lien vers le man :
    http://www.linux-kheops.com/doc/man/...n2/dup2.2.html


    Et voila un code d'expliquation de mes souvenir pas sur qu'il marche et je n'ai pas pus le tester

    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
     
    int     main()
    {
      int   p[2];
      pid_t pid;
      char  buf[128];
     
      pipe(p);
      pid = fork()
      if (pid)
        {
          close(p[0]);
          write(p[1], "hello\n", 6);
          write(p[1], "world!\n", 7);
          close(p[1]);
          wait(0);
          exit(0);
        }
      else
        {
          close(p[1]);
          while (1)
            {
              read(p[0], buf, sizeof (buf))
              printf("Message : %s\n", buf);
            }
        }
    }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 20
    Points : 23
    Points
    23
    Par défaut
    bonjour,

    pour utiliser un tube, il faut te rappeler de cette règle :

    Dans le processus écrivain, il te faut fermer le tube en lecture,
    dans le processus lecteur, il te faut fermer le tube en écriture.

    D'autre part et amha tu ne peux pas utiliser un tube avec plus de 2 processus( mais je me trompe peut-être).

    Donc pour résoudre ce que tu veux faire :
    - pas besoin de forker arbitre
    - utilise pour ping 2 tubes (1 pour l'écriture, 1 pour la lecture)
    - utilise pour pong 2 autres tubes (idem)

    Peut-être que quelqu'un voit plus simple ?

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 26
    Points : 5
    Points
    5
    Par défaut
    voila j'ai retravaillé mon code j'ai tjs une erreur avec arbitre pour l'affichage de ping à gagné mais je ne comprend pas pourquoi. si qqun peut m'aider.

    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
    #include<stdio.h>
    #include<stdbool.h>
    #include<stdlib.h>
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/wait.h>
    #include<signal.h>
    #include<string.h>
     
    int main ()
    {
    	int tube [2];
    	char texte[10];
    	int score1=0;
    	int score2=0;
    	pipe(tube);
    	int i;
    	pid_t ping;
    	ping=fork();
    	pid_t pong;
    	pong=fork();
    	char gagneping[9]="pingping";
    	char gagnepong[9]="pongpong";
     
    for(i=1;i<15;i++)
    {
    if (ping ==0)
    {
    write(tube[1], "ping", 5);
    sleep(1);
    }
     
    if (pong==0)
    {
    write(tube[1], "pong", 5);
    sleep(2);
    }
    i++;
    }
     
     
    pid_t arbitre;
    arbitre=fork();
    //if (arbitre==0)
    //read(tube[0],texte,10);
    while((score1 <11) || (score2<11))
    {
    	read (tube[0], texte, 10);
    	printf ("%s\n",texte);
     
    if (strcmp(texte,gagneping))
    	{	
    		score1++;
    		printf (" ping gagne %i\n à %i\n", score1,score2);
    		sleep(1);
    	}
     
    	else if (strcmp(texte,gagnepong))
    	{
    		printf ("pong gagne %i\n à  %i\n", score1,score2);
    		score2++;
    	}
    }
     
    	/*if (score1==11 || score2==11)
    	{
    		signal(SIGKILL, getpid);
    	}
     
    */
    return 0;
    }

Discussions similaires

  1. Ecrire et lire dans un fichier texte
    Par podz dans le forum C
    Réponses: 3
    Dernier message: 25/10/2005, 16h57
  2. Réponses: 18
    Dernier message: 09/08/2005, 12h57
  3. Lire dans un champ MEMO
    Par Sydaze dans le forum Bases de données
    Réponses: 4
    Dernier message: 18/04/2005, 15h54
  4. Réponses: 23
    Dernier message: 22/04/2004, 11h55
  5. Réponses: 3
    Dernier message: 12/11/2003, 00h34

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