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

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

Marsh Posté le 08-02-2006 à 12:50:31    

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)

Reply

Marsh Posté le 08-02-2006 à 12:50:31   

Reply

Marsh Posté le 30-03-2008 à 01:24:17    

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.

Reply

Marsh Posté le 03-04-2008 à 21:57:32    

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.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed