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 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
    1. bonjour

      Je l'ai fait
      mais toujours eu de solution je comprends toujours pas pourquoi
      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. 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. .
            1. Obligé d'écrire un message le 17 pour que celui du 16 apparaisse... étrange....
          2. 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.