Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1254 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Producteur/Consommateur avec file de messages et signaux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Producteur/Consommateur avec file de messages et signaux

n°1301192
treolar
Posté le 08-02-2006 à 12:50:31  profilanswer
 

Bonjour,  :hello:  
 
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
 
Merci
 
(toujours en cours de travail)

mood
Publicité
Posté le 08-02-2006 à 12:50:31  profilanswer
 

n°1709819
hsmrpro
Posté le 30-03-2008 à 01:24:17  profilanswer
 

Bonjour à toi
Pas mal comme projet. Mais je sais pas tu pourras toujours vérifier mais il me semble qu'avec les option de la fonction msgsnd et msgrcv dans la parties des options tu peux gérer le comportement du processus envoyant ou recevant le message!
 
A vérifier.

n°1712467
Sve@r
Posté le 03-04-2008 à 21:57:32  profilanswer
 

treolar a écrit :

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


Erreur, le source se trouve (=> très mal protégé ton site)
 
Bon, il y a une foule de remarques à faire donc je t'en balance un peu comme je les vois
 
1) ta fonction "nePlusTraiterSigna()" est inutile. Remplace signal(SIGUSR1, nePlusTraiterSignal) par signal(SIGUSR1, SIG_IGN)
 
2) le type d'un message permet de le classer par rapport aux autres messages. C'est donc un nombre déterminé qui a une signification dans la tête du programmeur. Toi tu lui mets getpid() donc un nombre quasiment aléatoire. Ca n'a pas d'importance ici mais faut penser aussi aux autres qui connaissent les msg et qui vont se poser des questions
 
3) tu peux remplacer tes multiples strcat() par un unique sprintf()
 
4) faut essayer au maximum de ne pas avoir de globale. Je pense (j'ai pas regardé en détail) que nb_msg_file n'est pas vraiment utile (tu peux retrouver l'info avec msgctl())
 
5) ta fonction "traiterSignal" ne sera appelée que sur SIGUSR1. Son test sur signum est donc inutile
 
6) La valeur 133 pour la clef de ta boite => pourquoi pas. Mais qui te dit qu'une autre appli n'utilise pas déjà cette clef ? => si ton programme est autonome tu peux alors utiliser la valeur "IPC_PRIVATE". Si ton programme est en relation avec un autre, il faut que les deux programmes utilisent une clef commune mais pas utilisée par d'autres => la fonction ftok() peut t'aider à générer une telle clef
 
7) t'as parfaitement compris que msgsnd() voulait en paramètre la taille du message à envoyer sans la taille du type ce qui t'empêche de mettre sizeof(msg). Tu t'en es sorti en mettant strlen(text) + 1 mais si ton message s'était composé de 3 chaines, 4 int et 2 doubles, tu serais parti à mettre "strlen(xxx) + strlen(yyy) + sizeof(int) + ..." ce qui devient imbittable. Et imagine que tu aies plusieurs msgsnd() et que, en plus, tu décides après coup de rajouter une valeur de plus !!!
 
C'est pourquoi, je te conseille de passer par deux structures
La première structure, que tu peux nommer par exemple "t_corps", contiendra le corps du message, c'est à dire tout ce qui t'es utile à toi. Et la seconde de type t_msgbuf, contiendra le type plus le corps
Exemple

Code :
  1. typedef struct {
  2.     char txt[SZ_MESSAGE];                     // Texte du message
  3. } t_corps;
  4.  
  5. typedef struct {
  6.     mtyp_t mtype;                            // Type de message
  7.     t_corps mcorps;                         // Corps du message
  8. } t_msgbuf;


Et quand tu appelles msgsnd(), tu lui passes en 3° paramètre "sizeof(t_corps)"
 
Bon, une structure pour un unique texte ça semble inutile mais faut penser aussi à l'évolutivité de ton code. Avec cette technique, tu peux ensuite rajouter tout ce que tu veux dans "t_corps" sans te prendre la tête à devoir aller modifier tous les msgsnd()...
 
Voilà mes remarques. Avec une remise en page de ton code, quelques commentaires, une indentation élégante ça peut donner un joli exercice. Tu peux télécharger mon cours sur les IPC ici http://fr.lang.free.fr/cours/IPC_Csyst_v1.0.pdf


Message édité par Sve@r le 03-04-2008 à 22:07:15

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Producteur/Consommateur avec file de messages et signaux

 

Sujets relatifs
[VB6] Désactiver les messages sous Wordcapturer la taille du fichier avant upload via type="file"
include file: Comment appeler la page en cours?????probleme avec include file
Debug Assertion Failed ! File: dbgheap.cforum et messages lu
Ignorer les messages de confirmation (VBA Excel)envoyer des messages par modem
Warning: ftp_fput() [function.ftp-fput]: Opening data channel for fileSelect et Bad file descriptor
Plus de sujets relatifs à : [C] Producteur/Consommateur avec file de messages et signaux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR