Boucle infinie et file de message

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

/* 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

7 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
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
}

J'espere avoir ete clair>

A+
Mon site internet : http://pistol.petesampras.free.fr
3
kyfranBibax Messages postés 26 Date d'inscription mercredi 11 mai 2005 Statut Membre Derniè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.

Have a nice day

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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
kyfranBibax Messages postés 26 Date d'inscription mercredi 11 mai 2005 Statut Membre Derniè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.

Je vous remercie d'avance.

Have a nice day

Bibax en fait un max
0
luhtor Messages postés 2023 Date d'inscription mardi 24 septembre 2002 Statut Membre Dernière intervention 28 juillet 2008 6
6 janv. 2008 à 12:42
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 ?
0
adduke Messages postés 4 Date d'inscription mardi 2 novembre 2004 Statut Membre Dernière intervention 5 février 2008
5 févr. 2008 à 00:02
Essaye
fflush(stdout);
après printf ();

@+,
Dukyduke
0
Rejoignez-nous