Pregunta

Tengo la siguiente aplicación que reproduce un problema que estoy teniendo en una aplicación más grande, con colas de mensajes del sistema v. básicamente, la función principal genera una clave, a continuación, crea una cola de mensajes con msgget (). Entonces 3 tenedores se generan, cada uno con un ID diferente. cada uno de ellos funciona msgrcv con un número posative diferente (por lo que están a la espera para los diferentes mensajes).

Principal luego duerme durante unos segundos una envía un mensaje al id = 3. Sin embargo, no el tercer hilo que se despierta, pero una diferente en su lugar. Este código se aísla por completo para que pueda probar por ti mismo. Lo que está mal con este código?

#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 espero para 2 que significa que los mensajes cuya estructura contiene un mtype se define en exactamente 2. 3 por 3 y así uno. Mi punto de referencia era esta guía: http: //www.ecst .csuchico.edu / ~ beej / guía / IPC / mq.html . ¿Alguien puede ayudar por favor? (Puede que tenga que modificar la línea ftok de código para apuntar a un archivo válido en su propia máquina para probar con éxito). Estoy corriendo Fedora 10 en un EeePC 1000H

¿Fue útil?

Solución

Ahh pensar lo he arreglado. Es porque yo estaba usando un int en lugar de un tiempo para que el primer miembro fijado en la estructura de la "mtype". pasando {1l, "hola"} en su lugar y el cambio de la definición de i a largo parece haber arreglado

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top