Probleme de processus sous linux

Bonjour,
Je fais de la programmation c sous linux
je dois ecrire un programme qui "Permet de creer un processus fils. Ce dernier lit 10 carracteres en entrée standard et les envoit via un pipe à son pere . le pere va les lire er les affiche à l' écran"

J'ai écrit ce code
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
void main()
{
int i,pid,T[2];
int tab1[10],tab2[10];
pipe(T);

pid=fork();
if( pid == -1)
{ printf ("\nErreur echec de fork\n");
exit(1);
}
if (pid==0)
{
printf ("Je suis le Fils\n");
close( T[0]);
for ( i=0;i<5;i++)
{
printf("\n\nDonner le caractère de numéro %d\n",(i+1));
scanf("%d",&tab1[i]);
}
write(T[1],tab1,10);
close(T[1]);
}

printf ( "PERE\n");
read( T[0],tab2,10);
printf("Début affichage FILS---------------------------------------------------------\n");
for ( i=0;i<5;i++)
{
printf("\nle caractère numéro %d est i = %d\n",(i+1),tab2[i]);
}

close(T[0]);
exit(1);
}

le probleme c'est qu'il ya deux affichages mais j comprend pas pourquoi

Merci de m'aider
Configuration: Linux / Firefox 3.5.8

6 réponses

  1. Bonjour,

    Quand tu testes le retour du fork :
    -1 : erreur
    0 : dans le fils
    > 0 : dans le père (retour=pid du fils)

    Ici, le traitement où tu as affiché "PERE", va se faire si pid==0, mais aussi si pid>0 !!!
    Alors, tu obtiens un affichage par le père, et un par le fils.

    Il te manque donc juste un else avant printf("PERE") pour que ca fonctionne (à vue d'oeil).

    Cordialement,
    M.
    1. .
      1. Obligé d'écrire un message le 17 pour que celui du 16 apparaisse... étrange....
    2. J'ai rajouté le else au dessus de pere ce qui me donne ce code
      QUI ne me donne toujours pas de solution

      #include <stdio.h>
      #include <unistd.h>
      #include <stdlib.h>
      void main()
      {
      int i,pid,T[2];
      int tab1[10],tab2[10];
      pipe(T);

      pid=fork();
      if( pid == -1)
      { printf ("\nErreur echec de fork\n");
      exit(1);
      }
      if (pid==0)
      {
      printf ("Je suis le Fils\n");
      close( T[0]);
      for ( i=0;i<5;i++)
      {
      printf("\n\nDonner le caractère de numéro %d\n",(i+1));
      scanf("%d",&tab1[i]);
      }
      write(T[1],tab1,10);
      close(T[1]);
      }
      else
      printf( "PERE\n");
      read( T[0],tab1,10);
      printf("Début affichage FILS----------------------------------\n");
      for ( i=0;i<5;i++)
      {
      printf("\nle caractère numéro %d est i = %d\n",(i+1),tab1[i]);
      }

      close(T[0]);
      exit(1);
      }
      1. Bonjour,
        Il faudrait commencer par réfléchir avant de coder.
        Il faut mettre tout le code concernant le père dans ton else, pas seulement le printf !!
        1. bonjour

          Je l'ai fait
          mais toujours eu de solution je comprends toujours pas pourquoi
          1. Bonjour et merci à vous pour vos reponses
            J'ai modifié mon code eu niveau du pere
            [CODE]else
            {
            printf( "PERE\n");
            read( T[0],tab1,10*sizeof(int));
            printf("Début affichage FILS----------------------------------\n");
            for ( i=0;i<5;i++)
            {
            printf("\nle caractère numéro %d est i = %d\n",(i+1),tab1[i]);
            }

            close(T[0]);
            }
            exit(1);
            }
            [/CODE]
            voici ce qu'il me donne comme affichage a la lecture
            [CODE]Je suis le Fils

            Donner le caractère de numéro 1
            PERE
            [/CODE]

            et à la fin
            [CODE]Je suis le Fils

            Donner le caractère de numéro 1
            PERE
            1

            Donner le caractère de numéro 2
            2

            Donner le caractère de numéro 3
            3

            Donner le caractère de numéro 4
            4

            Donner le caractère de numéro 5
            5
            Début affichage FILS----------------------------------

            le caractère numéro 1 est i = 1

            le caractère numéro 2 est i = 2

            le caractère numéro 3 est i = 3

            le caractère numéro 4 est i = 4

            le caractère numéro 5 est i = 5
            [/CODE]
            normalement c'est la pere qui devrait afficher et pas le fils j vois pas le probleme
            j comprend non plus pourquoui pere s'affiche quand on demande le premier caractere

            Merci pour votre aide