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 :

Synchronisation entre processus pères et fils


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2011
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2011
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Synchronisation entre processus pères et fils
    je trouve sur le net un code source(Synchronisation entre processus pères et fils) j'aimerai comprendre comment je peut exécuter ce programme sous unix
    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
    78
    79
     arnaud.c
    #include<stdio.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<wait.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include<signal.h>
    void erreur(char *mes);
    char tab[10];
    int main(void)
    {
    int pidb,pidc,p1;
    int bip=0;
    char car[10];
    // creation du pipe
    unlink("pipe");
    mkfifo("pipe",0777);
    // creation des 2 fils
    pidb=fork();
    if (pidb==0) execv("bob",NULL);
    pidc=fork();
    if (pidc==0) execv("charly",NULL);
    //ouverture d'un pipe en ecriture
    p1=open("pipe",O_WRONLY);
    if (p1==-1) erreur("pb d'ouverture en ecriture");
    printf("\ntaper une sequences de caracteres\n");
    scanf("%s",car);
    // lecture des caracteres
    int i=0;
    while(car[i]!='\0') // pas de &car[i]
    {
    // tri+envoi d'un signal au fils approprié
    usleep(500);
    if (car[i]>='A' && car[i]<='z')
    kill(pidb,SIGUSR1);
    else if (car[i]>='1' && car[i]<='9')
    kill(pidc,SIGUSR1);
    else
    {
    printf("caractere non valide\n");
    bip=1; // on n'ecrit rien dans le pipe
    }
    // écriture dans le pipe
    if (bip==0) write(p1,&car[i],sizeof(car));
    i++;
    }
    // on envoie le message de fin de l'ecriture qui est "!"
    char fin;
    fin='!';
    write(p1,&fin,sizeof(car));
    //on referme le pipe en écriture
    usleep(500);
    close(p1);
    // on ouvre le pipe en lecture
    p1=open("pipe",O_RDONLY);
    if (p1==-1) erreur("pb d'ouverture en lecture");
    //on lit
    int j;
    for(j=0;j=10;j++)
    {
    read(p1,&tab[j],sizeof(tab));
    printf("%s",&tab[j]);
    }
    //on referme le pipe en lecture
    usleep(500);
    close(p1);
    // on tue les processus
    kill(pidb,SIGKILL);
    kill(pidc,SIGKILL);
    return(0);
    }
    void erreur(char *mes)
    {
    printf("%s\n",mes);
    exit(-1);
    }

    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
    bob.c
     
     
     
    #include<stdio.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<wait.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include<signal.h>
    void erreur(char *mes);
    void lect(int sig);
    void envoyer();
    // s'occupe des lettres
    int p1;
    int i=0;
    char tab[10][10];
     
     
    int main(void)
    {
        //ouverture d'un pipe en lecture
        p1=open("pipe",O_RDONLY);
        if (p1==-1) erreur("pb d'ouverture en lecture\n");
     
        // on se prepare au signal
        signal(SIGUSR1,lect);
     
        // on verifie si le signal de fin a ete envoyé
        char fin;
        fin='!';
        if (strcmp(&tab[10][i],&fin)==0)
              envoyer();
     
        // on attend le signal
        for(;;)
        {
             pause();
        }
    }
     
    void lect(int sig)
    {
    char lett;
    // lecture du pipe
    read(p1,&lett,sizeof(lett));
    //on stocke la variable ds un tableau
    tab[10][i]=lett;
    i++;
    // on affiche le resultat
    printf("la lettre lue est %c\n", lett);
    //on referme le pipe
    close(p1);
    }
    void envoyer()
    {
    //on ouvre le pipe en éccriture cette fois ci
    p1=open("pipe",O_WRONLY);
    write(p1,tab,sizeof(tab));
    close(p1);
    }
    void erreur(char *mes)
    {
    printf("%s\n",mes);
    exit(-1);
    }
    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
     charly.c
    #include<stdio.h>
    #include<fcntl.h>
    #include<stdlib.h>
    #include<string.h>
    #include<unistd.h>
    #include<wait.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include<signal.h>
    void erreur(char *mes);
    void lect(int sig);
    void envoyer();
    // s'occupe des chiffres
    int p1;
    int i=0;
    char tab[10][10];
     
    int main(void)
    {
        //ouverture d'un pipe en lecture
        p1=open("pipe",O_RDONLY);
        if (p1==-1) erreur("pb d'ouverture en lecture\n");
     
        // on se prepare au signal
        signal(SIGUSR1,lect);
     
        // on verifie si le signal de fin a ete envoyé
        char fin;
        fin='!';
        if (strcmp(&tab[10][i],&fin)==0)
              envoyer();
     
        // on attend le signal
        for(;;)
        {
             pause();
        }
    }
    void lect(int sig)
    {
    char chiff;
    // lecture du pipe
    read(p1,&chiff,sizeof(chiff));
    //on stocke la variable ds un tableau
    tab[10][i]=chiff;
    i++;
    // on affiche le resultat
    //printf("la lettre lue est %c\n", lett);
    //on referme le pipe
    close(p1);
    }
    void envoyer()
    {
    //on ouvre le pipe en éccriture cette fois ci
    p1=open("pipe",O_WRONLY);
    write(p1,tab,sizeof(tab));
    close(p1);
    }
    void erreur(char *mes)
    {
    printf("%s\n",mes);
    exit(-1);
    }

    et merci en avance

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2009
    Messages : 153
    Points : 160
    Points
    160
    Par défaut
    Salut,

    Dans un premier temps il te faut compiler les 3 programmes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    gcc -o arnaud arnaud.c
    gcc -o bob bob.c
    gcc -o charly charly.c
    Ensuite, tu exécutes 'arnaud', qui lui exécutera 'bob' et 'charly' (lignes 23 et 25 de arnaud.c) :


Discussions similaires

  1. Gestion des exceptions entre job Père et fils
    Par jbe77 dans le forum Exécution et industrialisation
    Réponses: 1
    Dernier message: 13/10/2009, 11h08
  2. C processus père et fils
    Par pjaar dans le forum POSIX
    Réponses: 4
    Dernier message: 21/09/2009, 10h00
  3. Réponses: 7
    Dernier message: 04/06/2009, 16h38
  4. Erreur de dialogue entre formulaire père et fils
    Par talrashha dans le forum IHM
    Réponses: 3
    Dernier message: 22/08/2008, 14h38
  5. Réponses: 8
    Dernier message: 09/11/2006, 14h01

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