Probleme de processus sous linux

simachille Messages postés 79 Statut Membre -  
simachille Messages postés 79 Statut Membre -
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. swed
     
    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.
    0
  2. bug
     
    .
    0
    1. swed
       
      Obligé d'écrire un message le 17 pour que celui du 16 apparaisse... étrange....
      0
  3. simachille Messages postés 79 Statut Membre
     
    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);
    }
    0
  4. swed
     
    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 !!
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. simachille Messages postés 79 Statut Membre
     
    bonjour

    Je l'ai fait
    mais toujours eu de solution je comprends toujours pas pourquoi
    0
  7. simachille Messages postés 79 Statut Membre
     
    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
    0