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 là (=> 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 :
typedef struct { char txt[SZ_MESSAGE]; // Texte du message } t_corps; typedef struct { mtyp_t mtype; // Type de message t_corps mcorps; // Corps du message } 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.