Linux上的System V Msg队列无法按预期工作

时间:2008-12-24 00:22:38

标签: c linux message-queue

我有以下应用程序,它复制了我在具有系统v消息队列的较大应用程序中遇到的问题。基本上,main函数生成一个键,然后使用msgget()创建一个消息队列。然后产生3个叉子,每个叉子具有不同的id。他们每个人都使用不同的假号运行msgrcv(因此他们正在等待不同的消息)。

Main然后睡几秒钟a发送一条消息给id = 3.但是不是第三个​​被唤醒的线程而是另一个线程。此代码完全隔离,因此您可以自己尝试。这段代码出了什么问题?

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

如果我等待2,则意味着其结构包含mtype的消息设置为 2. 3 for 3等等。我的参考点是本指南:http://www.ecst.csuchico.edu/~beej/guide/ipc/mq.html。有人可以帮忙吗? (您可能需要修改ftok代码行以指向您自己计算机上的有效文件以进行成功测试)。我在EeePC 1000H上运行Fedora 10

1 个答案:

答案 0 :(得分:1)

啊,我想我已经修好了。这是因为我在结构中为“mtype”使用了int而不是long。传入{1l,“hello”}代替并将i的定义更改为long似乎已经修复了它