IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

File de message qui se bloque


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Par défaut File de message qui se bloque
    Bonjour, je programme une application utilisant les files de message.

    Je rencontre un problème, mon application se bloque sur la fonction msgsnd.

    Voici comment fonctionne le programme : 4 processus tournent en parallèle

    Un processus A remplit les files de message des processus B et C. Jusque là pas de soucis, au bout d'un moment les files de messages des processus B et C sont pleines, donc le processus A se bloque sur msgsnd, je pense que c'est le comportement normal.

    Après un premier msgrcv les processus B et C font un sleep d'une ou deux secondes et doivent envoyer le message qu'ils ont reçu de A à D, sauf que le processsus se bloque sur la fonction msgsnd. Je ne comprends pas parce que la file de message du processus D est vide donc il ne devrait y avoir aucun soucis pour l'envoi mais les processus B et C se bloquent bien sur la fonction msgsnd.

    Merci de votre aide

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Bonsoir,

    On suppose que tu travailles sous Linux et que tu utilises les IPC SysV.

    Les msgsnd() de B et C bloquent à quel moment ? Dès le premier appel ou après avoir suffisamment tourné pour remplir la file de D ? Est-ce que D lit ses messages ?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Par défaut
    Bonsoir, j'ai oublié de préciser que j'utilisais MAC OS X.

    J'ai mis en suspens le processus C pour plus de facilité à comprendre.

    En gros A envoie plein de messages à B à la suite. B receptionne mais il y'a un sleep entre chaque reception donc forcément il ne suit pas le rythme et les messages s'accumulent jusqu'à remplir la file de B avant la fin du premier sleep.

    Du coup A se bloque ce qui est normal. Ensuite à la fin du sleep B envoie un message à D mais là ça ne passe pas. D est bien en attente d'un message mais ne reçoit jamais rien. Et s'il ne reçoit rien c'est parce que B se bloque lors du msgsnd(). Pourtant la file de D est belle est bien vide.

    Le programme fonctionne parfaitement lorsque je change les temps dans les sleep et que je fais en sorte que la file de B ne soit jamais pleine. Or lorsque la file de B est une fois pleine, le msgsnd de B se bloque sans que je comprenne pourquoi. msgsnd() de B semble ne pas passer lorsque la file de B est pleine alors que ça ne devrait avoir aucune incidence ... Car lorsque la file de B n'est pas pleine il n'y a aucun soucis

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Peut-on voir ton code ?

  5. #5
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Par défaut
    Processus A

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    for(int i = 0; i < nbPieces*2; i++){           
     
     
     
            T_message* pieceAEnvoyer = (T_message *)malloc(sizeof(T_message));      
     
     
     
     
     
            sleep(tempsPieces);                            
     
     
     
     
            random = rand()%(1-4) +1;                    
     
     
     
            pieceAEnvoyer->mtype = random;                 
     
     
     
     
     
     
     
                msgsnd (msgB, pieceAEnvoyer, strlen(pieceAEnvoyer->mtext), 0);    
     
            }

    Processus B

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     while(entrepotPlein == 0) {
     
            T_message* texte = (T_message *)malloc(sizeof(T_message));
     
     
     
            msgrcv(msgB, texte, 256, 0, 0);
     
    sleep(2);
     
                msgsnd(msgD, texte, 256, 0);
     
    }


    Processus D

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     for (int i = 0; i < nbPieces*2; i++) {                 
     
            T_message* texte = (T_message *)malloc(sizeof(T_message));     
     
     
            msgrcv(msgD, texte, 256, 0, 0); 
     
    printf(...);
     
    }

  6. #6
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    On est bien d'accord que tu as mis "quelque part" dans ton code que T_message est composé d'un long et d'un char* ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct msgbuf {
    long mtype; /* type de message, doit être > 0 */
    char mtext[1]; /* contenu du message */
    };
    Ton random a l'air de mettre "au moins" 1... mais n'hésite pas à ajouter des parenthèses en plus...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     random = (rand() % (1 - 4)) + 1;
    Il y aurait moyen que tu fasses un autre programme qui affiche l'état de chaque file en parallèle ?




    ...................
    Attend....
    Où se trouve ton msgget qui transforme le key en int ?
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Avril 2011
    Messages : 42
    Par défaut
    Bonjour, je n'ai pas trop envie d'afficher tout le code car c'est un projet et il m'est déjà arrivé quelques problèmes de plagiat lorsque j'ai demandé de l'aide sur le net en postant tout mon code

    Je l'ai simplifié mais oui bien entendu j'ai déclaré ma structure elle est bien composée d'un long et d'un char *, je fais bien un ftok et un msgget avant pour déclarer mes files , chacune avec une clé différente.

    Le random quant à lui génère bien un nombre entre 1 et 3 il n'y a pas de soucis.

    Comme je l'ai dit le programme ne présente aucun soucis lorsque les files n'atteignent jamais leur taille maximum donc je ne vois pas le soucis.

    Pour ce qui est de l'affichage d'une liste comment puis-je faire ? Jusqu'à présent j'ai seulement réussi à afficher le nombre de message présent dans chaque file mais je ne sais pas exactement ce que vous entendez par "état" d'une file ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 07/05/2010, 08h54
  2. Message attente qui ne bloque pas l'affichage en background
    Par gentyjp dans le forum Windows Forms
    Réponses: 1
    Dernier message: 17/05/2008, 00h25
  3. Réponses: 8
    Dernier message: 25/11/2005, 18h38
  4. [XHTML] Messages qui défilent en XHTML
    Par Linoa dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 27/09/2005, 15h00
  5. Requête SQL qui me bloque
    Par David Guillouet dans le forum Langage SQL
    Réponses: 5
    Dernier message: 27/04/2004, 14h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo