我有以下的应用程序,它复制我与System V消息队列更大的应用程序具有的问题。基本上,主要功能生成密钥,然后创建具有msgget一个消息队列()。然后3个叉催生,每个具有不同的ID。它们中的每运行msgrcv具有不同posative数目(因此它们在等待不同的消息)。

主然后休眠几秒钟将消息发送到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 3等等之一。我的参考点是本指南: HTTP://www.ecst .csuchico.edu /〜beej /引导/ IPC / mq.html 。任何人都可以帮助吗? (您可能需要修改的代码ftok行指向一个有效的文件在自己的机器上测试成功)。我上的EeePC 1000H

运行Fedora 10
有帮助吗?

解决方案

稀释想我已经固定它。这是因为我用的是一个int,而不是一个长期在结构为“MTYPE”设置的第一个成员。传入{1L,“你好”}代替和改变i的定义,以长似乎已经固定它

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top