Question

J'ai l'application suivante qui reproduit une question que je vais avoir une plus grande application avec des files d'attente de messages système v. Fondamentalement, la fonction principale génère une clé, puis crée une file d'attente de message avec msgget (). Ensuite, 3 fourchettes sont donné naissance, chacun avec un identifiant différent. chacun d'eux exécute msgrcv avec un certain nombre posative différents (ils sont en attente pour les messages différents).

dort alors principal pendant quelques secondes un envoie un message à id = 3. Toutefois, il est pas le troisième fil qui se réveille, mais un différent au lieu. Ce code est complètement isolé de sorte que vous pouvez l'essayer par vous-même. Quel est le problème avec ce code?

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <sys/wait.h>

struct dummy_struct {
    long mtype;
    char message[255];
};

int msg_queue_id;
void recv_thread(int id);

int main(int argc, char **argv)
{
    int i;
    key_t key;
    struct dummy_struct dummy = { 3, "hello" };

    //create a unique key
    if (key = ftok("/mnt/mydocuments/code/sys_v_fork_test/main.c", 'a') == -1)
    {
        printf("ftok didn't work\n");
        exit(1);
    }

    //create the unix sys 5 message queue
    if ((msg_queue_id = msgget(key, 0644 | IPC_CREAT)) == -1)
    {
        printf("msgget failed\n");
        exit(1);
    }
    else
        printf("my message queue id: %i\n", msg_queue_id);

    //fork off multiple recievers
    for (i = 1; i < 4; i++) // <- NOTE: 1 -> 4
    {
        if (fork() == 0)
            recv_thread(i);
    }

    printf("sleeping\n");
    sleep(5);

    //wait a little then send a message

    printf("sending message\n");
    if (msgsnd(msg_queue_id, &dummy, sizeof(struct dummy_struct), 0) == -1)
    {
        printf("msgsnd failed\n");
    }
    printf("main thread exiting");
    _exit(0);
}

void recv_thread(int id)
{
    struct dummy_struct dummy;

    printf("recv_thread with id: %i\n", id);

    if (msgrcv(msg_queue_id, &dummy, sizeof(struct dummy_struct), id, 0) == -1)
        printf("error in msgrcv\n");
    else
        printf("thread %i got %s back\n", id, dummy.message);
}

Si j'attends 2 cela signifie que les messages dont struct contient un mtype réglé sur exactement 2. 3 pour 3 et donc un. http:: //www.ecst Mon point de référence était ce guide .csuchico.edu / ~ beej / guide / ipc / mq.html . Quelqu'un peut-il aider s'il vous plaît? (Vous devrez peut-être modifier la ligne ftok de code pour pointer vers un fichier valide sur votre propre machine à tester avec succès). Je suis en cours d'exécution Fedora 10 sur un EeePC 1000H

Était-ce utile?

La solution

Ahh pense que je l'ai fixé il. C'est parce que j'utilisais un entier plutôt qu'une longue pour le premier membre fixé dans la structure de la « mtype ». passant {1 litre, « bonjour » au lieu} et modifier la définition de i à semble longtemps pour avoir fixé

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top