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 :

processus en C


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 152
    Par défaut processus en C
    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
    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
    #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

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonjour,

    Si je ne comprends pas votre problème ( dans le sens, vous dites, affichage double ). C'est quoi qui est afficher en double?

    De plus, dans cet algo, après que le code du fils soit fini, il va exécuter le code du père.
    À la place d'un simple if ( pid == 0 ), il faut faire un if else, pour que la partie fils, n'aille pas dans le père. ( j'espère que je ne dis pas quelque chose de faux, cela date un peu :s )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  3. #3
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 477
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 477
    Par défaut
    LittleWhite a raison : il manque une clause else et des accolades autour du code censé être exécuté par le père, sinon le fils va l'exécuter lui-aussi et cela produira un affichage en double.

    D'autre part, ce ne sont pas des caractères que lis, mais des valeurs entières. Ça marche tout aussi bien, mais il faut se souvenir que les entiers sont codés sur plusieurs octets, et qu'il faut donc en tenir compte lorsque tu les envoies ou reçois.

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    write(T[1],tab1,10*sizeof(int));
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    read (T[0],tab2,10*sizeof(int));

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 152
    Par défaut sol
    Bonjour et merci à vous pour vos reponses
    J'ai modifié mon code eu niveau du pere
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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);
    }
    voici ce qu'il me donne comme affichage a la lecture
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Je suis le Fils
     
     
    Donner le caractère de numéro 1
    PERE
    et à la fin
    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
    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
    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

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Pouvez vous nous montrer le nouveau code que vous utilisez, s'il vous plait.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 152
    Par défaut code
    Bonsoir voici mon code

    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
    #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);
    }
    else 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*sizeof(int));
    close(T[1]);
    }
     
    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);
    }
    Merci

  7. #7
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 119
    Billets dans le blog
    148
    Par défaut
    Bonsoir,

    Pardon d'avoir redemandé la code, alors que vous l'aviez mis en haut :s. Je suis sincèrement désolé.

    Pour votre problème, c'est que vous ne comprennez pas vraiment ce que fait votre programme.
    Je pourrais vous donner comme conseil, de dédoubler les printf avec des fprintf, qui enverrait les mêmes messages que les printf mais dans deux fichiers ( un pour le père, un pour le fils ). Comme ça, cela vous montrera qui affiche quoi.

    Car actuellement, c'est le père qui affiche la liste ( ça se voit surtout dans le code ).
    Après, il y a aussi une erreur dans votre printf() qui affiche FILS, dans le code du père, mais ça c'est du détail, mais cela semble vous rendre confus.

    Sinon, pour la faite que PERE, s'affiche un peu n'importe ... premièrement, c'est bien le père qui affiche PERE, par contre, pour de savoir si c'est avant ou après le 'Je suis le fils' dépendra de la machine, du système, des conditions ( et peut être même des particules cosmiques ). Plus précisément, c'est ce que l'on appelerai un problème de race condition.
    Sinon, il faut juste que vous placiez le PERE après le read... car le read fait en sorte d'attendre toute les données provenant du fils, pour continuer.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Processus paralleles
    Par Lyes dans le forum Threads & Processus
    Réponses: 4
    Dernier message: 11/02/2003, 13h04
  2. 1 variable pour 2 processus
    Par kacedda dans le forum POSIX
    Réponses: 2
    Dernier message: 11/02/2003, 06h32
  3. probleme avec les processus
    Par saidi dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 05/02/2003, 00h18
  4. [VB6] [Système] Tuer un processus courant
    Par mdoyer dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 22/10/2002, 14h47
  5. Réponses: 2
    Dernier message: 04/10/2002, 09h13

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