Pergunta

Eu tenho o seguinte aplicativo que replica um problema que estou tendo em um aplicativo maior com filas sistema v mensagem. Basicamente, a função principal gera uma chave, em seguida, cria uma fila de mensagens com msgget (). Em seguida, 3 garfos são gerados, cada um com um ID diferente. cada um deles é executado msgrcv com um número posative diferente (por isso eles estão à espera de mensagens diferentes).

Main, em seguida, dorme durante alguns segundos um envia uma mensagem para id = 3. No entanto, não é o terceiro segmento que acorda, mas um diferente em seu lugar. Este código é completamente isolado para que você possa experimentá-lo sozinho. O que há de errado com esse 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);
}

Se eu esperar para 2 que as mensagens de meios cuja estrutura contém um conjunto mtype a exatamente 2. 3 para 3 e assim um. Meu ponto de referência era este guia: http: //www.ecst .csuchico.edu / ~ beej / guia / IPC / mq.html . Alguém pode ajudar por favor? (Pode ser necessário modificar a linha ftok de código para apontar para um arquivo válido em sua própria máquina de teste com sucesso). Estou executando o Fedora 10 em uma 1000H EeePC

Foi útil?

Solução

Ahh acho que eu fixa-lo. É porque eu estava usando um int em vez de um tempo para o primeiro conjunto de membros na estrutura para o "mtype". passando em {1l, "Olá"} vez e alterando a definição de i e longo parece ter fixa-lo

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top