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 :

Comment créer deux processus fils UNIX avec C


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 17
    Points : 17
    Points
    17
    Par défaut Comment créer deux processus fils UNIX avec C
    Bonsoir
    j'aimerais connaitre le code qui crée deux processus fils (père qui crée le fils 1 et ce dernier crée le fils 2 ) et qui affiche le message "bonjours fils 1" et "bonjours fils 2"

    J'ai fais le test de deux processus fils (père qui créer le fils 1 et le fils 2) et voici le 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
    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
    73
    74
    75
    76
    77
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/wait.h>
    #include<assert.h>
    #include<unistd.h>
    #include<string.h>
     
    int main(int argc, char* argv[])
    {
        int pipefd[2] ,pipefd2[2];
        int cpid,cpid2;
        char buf,buf2;
        assert(argc==3);
        if(pipe(pipefd)==-1)
        {
            perror("pipe");
            exit(EXIT_FAILURE);
        }
        cpid=fork();
        if(cpid==-1)
        {
            perror("fork");
            exit(EXIT_FAILURE);
        }
        if(cpid==0)
        {
            /* child reads from pipe */
            close(pipefd[1]); /*close unused write end */
            while(read(pipefd[0],&buf,1)>0)
            {
                write(STDOUT_FILENO,&buf,1);
                write(STDOUT_FILENO, "\n", 1);
            }
            close(pipefd[0]);
            exit(EXIT_SUCCESS);
        }
        else
        {
            /*parent writes argv[1] to pipe */
            close(pipefd[0]);/*close unused read end */
            write(pipefd[1],argv[1],strlen(argv[1]));
            close(pipefd[1]); /* reader will see EOF */
    //wait(NULL);  /*wait for child */
            if(pipe(pipefd2)==-1)
            {
                perror("pipe");
                exit(EXIT_FAILURE);
            }
            cpid2=fork();
            if(cpid2==-1)
            {
                perror("fork");
                exit(EXIT_FAILURE);
            }
            if(cpid2==0)
            {
                /* child2 reads from pipe */
                close(pipefd2[1]); /*close unused write end */
                while(read(pipefd2[0],&buf2,1)>0)
                {
                    write(STDOUT_FILENO,&buf2,1);
                    write(STDOUT_FILENO,"\n", 1);
                }
                close(pipefd2[0]);
                exit(EXIT_SUCCESS);
            }
            else
            {
                /*parent writes argv[1] to pipe */
                close(pipefd2[0]);/*close unused read end */
                write(pipefd2[1],argv[2],strlen(argv[2]));
                close(pipefd2[1]); /* reader will see EOF */
                wait(NULL);  /*wait for child */
                exit(EXIT_SUCCESS);
            }
        }
    }
    Avec comme resultat :
    Nom : result.PNG
Affichages : 1179
Taille : 18,3 Ko

    désolé pour la disposition du resultat , avec les retour a la lignes , si vous trouver le probleme qui cause cela dans mon code , veillez me le signalez svp .

    Sinon , je voudrais faire un code qui crée le un processus fils 1 ensuite crée le processus fils 2 a partir du fils 1 et avoir le même résultat .

    Schéma du code que je voudrais : (Père-->Fils1-->Fils2 )
    Le schéma du code que j'ai posté : (Fils1<---Père--->Fils2)

    Merci !

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 678
    Points
    13 678
    Billets dans le blog
    1
    Par défaut
    As-tu écrit ce code ? L'as-tu compris ?

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2015
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mauritanie

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2015
    Messages : 17
    Points : 17
    Points
    17
    Par défaut
    Ce code est celui que notre prof nous donné , j'ai un peu compris le code , et ainsi que l'utilité des commandes (forks, pipe , write ect..) et des test.

    Cependant , je ne sais pas comment procéder pour la question 2 (père->fils1->fils2) , apparemment c'est juste la disposition qui change.

    Et donc je me dit :
    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
    cpid= fork
    if(cpid=0) {
    //Entrer dans le fils 1
                  cpid2 = fork(); // création du fils 2 dans le fils 1
                  if(cpid2=0)
                  {
                   //Code du fils2
                   }
    }
    // Sortie Du fils 1
                    Else
                    {
                     //Code Père du fils 1
                     }
    //........Fin
    Mais ça ne m'affiche qu'un seul résultat lors de la compilation , donc je sais pas comment m'y prendre.

    Edit: c'est bon je l'ai résolue , effectivement , mon raisonnement était juste et mon bug était juste lié a l'exit(EXIT_Success) qui sortait du programme après avoir fait la lecture du premier processus.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment créer deux processus fils UNIX avec C
    Par Astronge dans le forum Linux
    Réponses: 2
    Dernier message: 20/05/2015, 13h33
  2. Réponses: 2
    Dernier message: 10/02/2009, 21h06
  3. Comment créer un processus fils?
    Par Linkin dans le forum API, COM et SDKs
    Réponses: 1
    Dernier message: 11/04/2008, 14h27
  4. Comment créer deux jars avec leurs manifest
    Par pracede2005 dans le forum ANT
    Réponses: 1
    Dernier message: 22/09/2007, 21h37
  5. Réponses: 0
    Dernier message: 17/10/2005, 09h05

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