kyfranBibax
Messages postés26Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention 6 janvier 2008
-
5 janv. 2008 à 13:13
adduke
Messages postés4Date d'inscriptionmardi 2 novembre 2004StatutMembreDernière intervention 5 février 2008
-
5 févr. 2008 à 00:02
Bonjour,
j'ai un petit problème avec des files de messages et une boucle infinie.
J'ai crée 2 programmes (un serveur et un cllient) qui communiquent via ne file de message.
Le serveur crée la file de message et attend des messages du client via celle-ci
Le client se connecte à la file de message et envoie des messages au serveur via celle-ci.
Mon problème est que le serveur crée bien la file de message et le client arrive à s'y connecté et y déposer des messages mais lorsque j'introduit une bocle infinie pour que le serveur attende le programme se bloque.
Meme les printf ne s'affcihe plus à l'écran et le client ne dépose plus les messagesdans la file, pourtant la file est bien crée (vérification avec ipcs)
Voici le code source serveur :
/* Projet : communication interne entre processus */
/* Serveur 1 */
/* Pour les I/O */
#include <stdio.h>
#include
#include <stdlib.h>
struct requeteT1
{
long mtype; /*nom du type */
pid_t pid; /* pid du client */
int nombre; /* opérande */
};
#define CLE_MSQ 18
int main()
{
printf("/************** Lancement du serveur 1 ****************/");
/* Création de la msq */
int msqid, l;
if((msqid=msgget((key_t) CLE_MSQ, 0777| IPC_CREAT | IPC_EXCL)) == -1)
{
perror("Serveur 1 : msgget ");
}
printf(" Serveur 1 : création de la msq");
struct requeteT1
{
long mtype; /*nom du type */
int nombre; /* opérande */
pid_t pid; /* pid du client */
};
int main()
{
/* Accès à la msq */
int msqid, l;
if((msqid=msgget((key_t) CLE_MSQ, 0)) == -1)
{
perror("Client 1 : msgget ");
}
printf("accès à la msq ");
/* création du message */
struct requeteT1 la_requeteT1;
la_requeteT1.mtype = 1;
la_requeteT1.pid = getpid();
la_requeteT1.nombre = 2;
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 8 janv. 2008 à 13:39
Salut
C'est tout a fait probable que ton mimi programme n'affiche pas "hello world" ou "test". En fait lorsque tu ecris avec printf, l'affichage ne se fait pas immediatememt. C'est ton ordi qui decide a quel moment il ecrit le buffer a l'ecran. Il l'ecrira lorsqu'il a un petit peu de temps ou lorsque le buffer est plein. Or avec ta bouvle infini, tu ne rend jamais la main au systeme qui ne peut donc pas ecrire le message a l'ecran.
2 solutions:
Soit tu forces l'ordi a afficher immediatement la ligne en placant un \n a la fin de ta chaine (il videra le buffer)
Soit tu redonne la main au systeme en introduisant un "sleep" dans ta boucle infinie.
Lorsque tu debbuggueras avec des printf pour savoir exactement a quel moment tu plantes, il faut toujours mettre un \n.
Exemple:
void main()
{
int T[10];
printf("hello"); //le printf avant le segmentation fault n'affichera rien
T[11]=0; //ecriture en dehors du tableau : segmentation fault
}
kyfranBibax
Messages postés26Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention 6 janvier 2008 6 janv. 2008 à 00:37
Bonsoir,
en fait je me suis trompé, l' "erreur" n'a rien à voir avec les files de messages.
Quand je crée un petit programme, il bugge dès que j'y introduit une boucle infinie.
Je ne pense pas que cela soit normal car j'ai déjà plusieurs sources tourner avec des boucles infinies.
Aurais-je oublié une option lors de la compilation de gcc ou est-ce le fait d'être sous mandriva 2008 (émulée avec parallels desktop)?
Je vous remercie d'avance pour vos renseignements.
kyfranBibax
Messages postés26Date d'inscriptionmercredi 11 mai 2005StatutMembreDernière intervention 6 janvier 2008 6 janv. 2008 à 11:05
Bonjour,
Le problème qui se pose est que dans le petit programme "hello world", il y a un affichage qui doit se faire.
Lorque je met le boucle infinie derrière, quand je lance le programme, l'affichage ne se fait pas.
Le programme se lance bien mais je ne sais pas pourquoi, il n'exécute pas les instructions situées avant la boucle infinie.
Je comprend pas pourquoi ça se passe comme ça. Surtout que j'ai besoin d'une boucle infinie pour mes file de message.