Boucle infinie et file de message [Résolu]

kyfranBibax 26 Messages postés mercredi 11 mai 2005Date d'inscription 6 janvier 2008 Dernière intervention - 5 janv. 2008 à 13:13 - Dernière réponse : adduke 4 Messages postés mardi 2 novembre 2004Date d'inscription 5 février 2008 Dernière intervention
- 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>

/* IPC */
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.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 la_requeteT1;

    while(1)
    {
        if((l=msgrcv(msqid, &la_requeteT1, sizeof(struct requeteT1) -4, 1, 0)) == -1)
        {
            perror("serveur 1 : ");
        }
        else
        {
            printf("requete : %d", (int) &la_requeteT1.mtype);
        }
       
    }
   
    return 0;
 }

et le code source client (bien que pense pas que ça vienne de lui)
/* Projet : communication interne entre processus */
/* Client 1 */

#include <stdio.h>

/* Pour les I/O */
#include <stdio.h>
#include
#include <stdlib.h>

/* IPC */
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

#define CLE_MSQ 18

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;

    /* envoi du message */
    if((l=msgsnd(msqid, &la_requeteT1, sizeof(struct requeteT1)-4, 0) == -1))
    {
        perror("Client 1 : msgsnd ");
    }
    else
    {
        printf("client 1 : message envoyé");
    }
    return 0;
 }

Quelqu'un a-t-il déjà eu ce problème avec une boucle infinie?
Pourriez vous m'aidez svp...

Have a nice day

Bibax en fait un max
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
Pistol_Pete 1055 Messages postés samedi 2 octobre 2004Date d'inscription 9 juillet 2013 Dernière intervention - 8 janv. 2008 à 13:39
3
Merci
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
}

J'espere avoir ete clair>

A+
Mon site internet : http://pistol.petesampras.free.fr

Merci Pistol_Pete 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de Pistol_Pete
kyfranBibax 26 Messages postés mercredi 11 mai 2005Date d'inscription 6 janvier 2008 Dernière intervention - 6 janv. 2008 à 00:37
0
Merci
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.

Have a nice day

Bibax en fait un max
Commenter la réponse de kyfranBibax
kyfranBibax 26 Messages postés mercredi 11 mai 2005Date d'inscription 6 janvier 2008 Dernière intervention - 6 janv. 2008 à 00:41
0
Merci
J'ai oublié de vous mettre le petit bout de code qui bug dès que j'y introduit une boucle infinie :

#include <stdio.h>

main
{
    printf("hello world");
  
    /* boucle infinie à l'origine du bug */
     while(1)
    {
    }

}

Merci d'avance

Have a nice day

Bibax en fait un max
Commenter la réponse de kyfranBibax
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 6 janv. 2008 à 10:32
0
Merci
Je comprends pas ou est le pb...
Commenter la réponse de luhtor
kyfranBibax 26 Messages postés mercredi 11 mai 2005Date d'inscription 6 janvier 2008 Dernière intervention - 6 janv. 2008 à 11:05
0
Merci
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.

Je vous remercie d'avance.

Have a nice day

Bibax en fait un max
Commenter la réponse de kyfranBibax
luhtor 2023 Messages postés mardi 24 septembre 2002Date d'inscription 28 juillet 2008 Dernière intervention - 6 janv. 2008 à 12:42
0
Merci
int main()
{
    printf("test");
   
    while (1)
    {
    };
   
    system("PAUSE");
    return 0;
};

Je vois pas pourquoi il n'afficherait pas "test", et d'ailleurs, il l'affiche très bien :) et heureusement.

Tu compiles avec quoi ?
Commenter la réponse de luhtor
adduke 4 Messages postés mardi 2 novembre 2004Date d'inscription 5 février 2008 Dernière intervention - 5 févr. 2008 à 00:02
0
Merci
Essaye
fflush(stdout);
après printf ();

@+,
Dukyduke
Commenter la réponse de adduke

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.