Domanda

Ho la seguente applicazione che riproduce un problema che sto avendo in un'applicazione più grande, con le code di sistema v messaggi. in sostanza, la funzione principale genera una chiave, quindi crea una coda di messaggi con msgget (). Poi 3 forcelle sono generati, ciascuna con una diversa id. ognuno di loro corre msgrcv con un numero posative diverso (in modo che sono in attesa di messaggi diversi).

principale, quindi posti letto per alcuni secondi A invia un messaggio a id = 3. Tuttavia è non il terzo filo che si sveglia, ma uno diverso, invece. Questo codice è completamente isolato, quindi si può provare voi stessi. Cosa c'è di sbagliato in questo codice?

#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);
}

Se aspetto 2 che significa messaggi il cui struct contiene un mtype impostato su esattamente 2. 3 per 3 e così uno. Il mio punto di riferimento era questa guida: http: //www.ecst .csuchico.edu / ~ beej / guide / IPC / mq.html . Qualcuno può aiutare, per favore? (Potrebbe essere necessario modificare la riga ftok di codice per puntare a un file valido sulla propria macchina per testare con successo). Io corro Fedora 10 su un EeePC 1000H

È stato utile?

Soluzione

Ahh credo di aver riparato. È perché stavo usando un int invece di un lungo per il primo membro impostato nella struttura per il "mtype". passando {1l, "ciao"} invece e cambiando la definizione di I a lungo sembra aver risolto

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top