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 file de message et signaux [Non suivi]


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Producteur/Consommateur avec file de message et signaux
    Bonjour,

    Pour faire profiter tout le monde de mon modeste travail, voici un Producteur/Consommateur mettant en oeuvre une file de message et des signaux.
    Le père envoit des messages qui contienne un seul caractère dans la file. Quand la file est pleine, le père s'endort. Le fils cherche à récupérer un message dans la file, dès que c'est fait, il y a donc une place de libre. Le fils envoit un signal au père pour le réveiller et lui dire qu'il y a de la place. Le père renvoit donc un message...
    Et ainsi de suite jusqu'à épuisement de la chaine à envoyer, passée en argument du petit programme.

    Toutes les remarques, suggestions, corrections d'erreurs sont les bienvenues. Je débute en programmation et je suis ouvert à toutes les discussion qui me feront progresser.

    Le source se trouve ici: testsig.c
    Une version en ligne se trouve ici: testsig.c.html


    Merci

    (toujours en cours de travail)
    edit: pour les problèmes de lecture de mon fichier, j'ai vite fait installé c2html...

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Tu peux poster la source ici non ?

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par hegros
    Tu peux poster la source ici non ?
    170 lignes... Le lien du P.O. me va très bien. Si tu ne le vois pas, demande aux responsables du forum d'activer le mode 'liens soulignés', ce sera plus clair...

  4. #4
    Membre régulier
    Inscrit en
    Août 2005
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 89
    Points : 91
    Points
    91
    Par défaut
    tu as utilisé les méthodes pause() et signal(), c'est une mauvaise solution.
    Que se passe t-il si le fils envoie le signal au père, juste avant que le père ne s'endorme ? Le signal est perdu.
    Il est conseillé d'utiliser les fonctions POSIX sigsuspend(), sigaction(), sigprocmask() etc...
    renseigne toi.

  5. #5
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par ciol2.6.12
    Il est conseillé d'utiliser les fonctions POSIX sigsuspend(), sigaction(), sigprocmask() etc...
    renseigne toi.
    Ok, je vais voir ca. Et je reviens faire signe quand il y a du neuf

    Merci !

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Points : 5 723
    Points
    5 723
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par hegros
    Tu peux poster la source ici non ?
    170 lignes... Le lien du P.O. me va très bien. Si tu ne le vois pas, demande aux responsables du forum d'activer le mode 'liens soulignés', ce sera plus clair...
    C'est surtout que maintenant en essayant de nouveau j'ai les 170 lignes ( j'ai pas compté je te fais confiance ) sur une seule ligne enfin une petite dizaine.... Bref, ca prête pas à lecture rapide.

  7. #7
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Quelques remarques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      chaineAEnvoyer = (char*) malloc (cumulDesLongueurs);
     
        for (mot=1; mot<argc; mot++){
          strcat (chaineAEnvoyer, *(argv+mot));
          strcat (chaineAEnvoyer, " ");
        }
    Premièrement le transtypage du malloc n'est plus nécessaire. Ensuite, avant d'utiliser strcat, il faudrait mettre la chaîne à 0 (au moins le premier caractère)

    - Je ne vois pas l'intêret de mettre la variable tour en global

  8. #8
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par fearyourself
    Quelques remarques:

    Premièrement le transtypage du malloc n'est plus nécessaire. Ensuite, avant d'utiliser strcat, il faudrait mettre la chaîne à 0 (au moins le premier caractère)

    - Je ne vois pas l'intêret de mettre la variable tour en global
    Cool, je vais voir ca aussi.
    Merci pour ces remarques, je sens que je vais progresser ! (et surtout coder plus proprement)
    Je vais concocter une petite fonction pour l'affichage aussi, car c'est très moche et pénible pour l'instant...

  9. #9
    Membre à l'essai
    Inscrit en
    Décembre 2005
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Quand le père a tout produit, et tout envoyé dans la file de message, il attend la fin du fils avec wait()

    Seulement, vu que le fils envoit un signal à chaque fois qu'il consomme un message de la file, le père continue de recevoir des signaux pour lui dire de se réveiller et de produire de nouveau, alors qu'il est en wait()...
    J'ai l'impression que ces signaux là me pourrissent le wait() du père ?

    Est-ce que je me trompe ?
    Faut-il que je m'arrage pour dire au père au d'ignorer les signaux une fois qu'il a fini de produire ? Y a-t-il une autre solution ?
    Suis-je complètement à côté ?

Discussions similaires

  1. Files de messages avec des threads
    Par killerbot dans le forum C
    Réponses: 2
    Dernier message: 07/01/2015, 18h13
  2. producteur consommateur avec les ipc
    Par Alays dans le forum C
    Réponses: 7
    Dernier message: 27/09/2012, 13h01
  3. Producteur Consommateur avec WF
    Par ArianeV dans le forum Windows Workflow Foundation
    Réponses: 4
    Dernier message: 03/01/2011, 16h07
  4. Réponses: 5
    Dernier message: 17/05/2007, 01h19

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