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 :

producteur consommateur avec les ipc


Sujet :

C

  1. #1
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Points : 0
    Points
    0
    Par défaut producteur consommateur avec les ipc
    Bonsoir je dois coder un algo de producteur consommateur j'ai fais ça :
    Avant de voir le code j'explique ce que je fais :

    donc je créé 3 processus un fils qui va écrire des entiers sur un fichier , un autre qui va lire un entier et le père qui initialise le fichier .
    On doit utiliser des sémaphores :
    une pour le contrôle d'accès au tampon
    le nb de places libres
    et le nb de places occupées

    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
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
     
    #include<unistd.h> // appel systeme fork
    #include<fcntl.h> // appel system unix ES
    #include<stdio.h> // librairie standard C
    #include <sys/types.h>
    #include <sys/sem.h> // semaphore IPC
    #include <sys/ipc.h> // services IPC
     
    key_t cle;
    int semid;
    FILE *f;
    int article=0;
    ushort init_sem[3]={1,10,0};
     
    int lireFichier(char * pathname){
     
    while(1){
    struct sembuf op;
     
    op.sem_num=2;op.sem_op=-1;op.sem_flg=0;
    semop(semid,&op,1);
     
    op.sem_num=0;op.sem_op=-1;op.sem_flg=0;
    semop(semid,&op,1);
     
    f=fopen(pathname,"a");
    printf("%d",fgetc(f));
    close(f);
     
    op.sem_num=0;op.sem_op=1;op.sem_flg=0;
    semop(semid,&op,1);
     
    op.sem_num=1;op.sem_op=1;op.sem_flg=0;
    semop(semid,&op,1);
    }
     
    }
     
    void initFichier(char * pathname){
     
    struct sembuf op;
     
    op.sem_num=0;op.sem_op=-1;op.sem_flg=0;
    semop(semid,&op,1);
     
    f=fopen(pathname,"a");
    fputc('0',f);
    close(f);
     
    op.sem_num=0;op.sem_op=1;op.sem_flg=0;
    semop(semid,&op,1);
     
    }
     
    int ecrireFichier(char * pathname){
     
    while(1){
     
    struct sembuf op;
     
    op.sem_num=1;op.sem_op=-1;op.sem_flg=0;
    semop(semid,&op,1);
     
    op.sem_num=0;op.sem_op=-1;op.sem_flg=0;
    semop(semid,&op,1);
     
    f=fopen(pathname,"a");
    fputc(article,f);
    article++;
    close(f);
     
    op.sem_num=0;op.sem_op=1;op.sem_flg=0;
    semop(semid,&op,1);
     
    op.sem_num=2;op.sem_op=1;op.sem_flg=0;
    semop(semid,&op,1);
    }
    }
     
    int main(int argc,char **argv){
     
    int pid,i;
     
    // creation d'une cle IPC en fonction du nom du programme
    if ((cle=ftok(argv[0],'0')) == -1 ) {
    fprintf(stderr,"Probleme sur ftoks\n");
    exit(1);
    }
     
    // demande un ensemble de semaphore (ici un seul mutex)
    if ((semid=semget(cle,3,IPC_CREAT|IPC_EXCL|0666))==-1) {
    fprintf(stderr,"Probleme sur semget\n");
    exit(2);
    }
     
    // initialise l'ensemble
    if (semctl(semid,0,SETALL,init_sem)==-1) {
    fprintf(stderr,"Probleme sur semctl SETALL\n");
    exit(3);
    }
     
    for(i=0;i<2;i++){
     
    pid=fork();
     
    if(pid>0&&i==0){
    printf("3");
    int x;
    for (x=0;x<2;x++){
    int message;
    pid=wait(&message);
    }
    //emctl(semid,0,IPC_RMID,0);
     
    }else if(pid==0&&i==0){
    printf("1");
    ecrireFichier("test.test");
     
    }else if(pid==0&&i==1){
    printf("2");
    lireFichier("test.test");
     
    }
     
    }
     
    }

    quand je lance ce code ma console ne m'achiffe rien quand je tire les while(1) des 2 fonctions j'ai les printf mais les while(1) j'en ai besoin de dans

  2. #2
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f=fopen(pathname,"a");	
    		printf("%d",fgetc(f));
    		close(f);
    Si tu utilises un fopen, tu dois utiliser un fclose.
    close prend un descripteur de fichier, pas un FILE *.

    Sinon ouvrir et fermer un fichier à chaque fois n'est pas très performant.
    Ouvre-le une seule fois et ferme-le que lorsque tu as terminé.

  3. #3
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Points : 0
    Points
    0
    Par défaut
    j'ai corrigé le fclose à la place de close et j'ai toujours le même problème

    edit: j'ai testé en mettant un printf("1"); dans le main au tout début il ne s'affiche pas ...

  4. #4
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Sinon il faut mettre des \n à la fin de chaque printf pour vider le buffer.
    Si tu utilise QtCreator, il faut faire un fflush(stdout).

  5. #5
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Points : 0
    Points
    0
    Par défaut
    ben ça ne change rien et pourtant je rentre dans mes fonctions parce que mon fichier se remplis donc j'utilise forcement ecrireFichier pourtant quand je mets mon printf(""); il ne se passe rien

  6. #6
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Essaye de :
    - mettre printf("toto\n"); fflush(stdout); ;
    <EDIT> : ou au choix puts("toto\n"); fflush(stdout); , les (f)puts sont plus rapide que les printfs, il vaut donc mieux les utiliser quand on peut. </EDIT>.
    - mettre fputs("toto", stderr); ;
    - lancer ton exécutable non pas via l'IDE mais via l'exécutable.

    En effet :
    - "\n" force théoriquement à vider le buffer mais certaines consoles comme celle proposée de base par QtCreator ne vide pas forcément le buffer, il faut donc le forcer avec fflush(stdout);
    - stderr n'est pas bufferisé ;
    - lancer via l'exécutable évite d'utiliser la console proposée par l'IDE.

    Sinon vérifies bien que tu lances le bon exécutable.

  7. #7
    Inactif  
    Inscrit en
    Mai 2012
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mai 2012
    Messages : 78
    Points : 0
    Points
    0
    Par défaut
    ouais le fflush ça fait afficher mes printfs mais maintenant j'ai un autre problème
    normalement je lance un producteur et un consommateur . le consommateur est bloqué tant que le producteur n'a rien produit . pourtant quand je lance mon programme le producteur produit 10 entiers qu'il met dans un fichier et mon consommateur n'intervient jamais , j'ai regardé dans ma boucle des processus le i reste à 0 il ne passe jamais à 1 du coup mon consommateur n'est jamais créé

  8. #8
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    C'est tout à fait normal.
    Regarde bien ce que fait le processus père après le premier fork.

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

Discussions similaires

  1. Producteur Consommateur avec WF
    Par ArianeV dans le forum Windows Workflow Foundation
    Réponses: 4
    Dernier message: 03/01/2011, 16h07
  2. programmer avec les queues IPC, suffisant?
    Par 1337cclean dans le forum Threads & Processus
    Réponses: 1
    Dernier message: 28/09/2010, 18h05
  3. Réponses: 5
    Dernier message: 17/05/2007, 01h19
  4. Réponses: 8
    Dernier message: 09/02/2006, 18h51

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