Linux上的系统V消息队列无法正常工作

我有以下应用程序,它复制了我在一个更大的应用程序系统v消息队列中的问题。 基本上,主函数生成一个密钥,然后用msgget()创build一个消息队列。 然后产生3个叉,每个都有一个不同的ID。 他们每个运行msgrcv与不同的提示号码(所以他们正在等待不同的消息)。

然后主hibernate几秒钟发送消息到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/guide/ipc/mq.html 。 任何人都可以帮忙吗? (您可能需要修改ftok代码行以指向自己机器上的有效文件才能成功testing)。 我在EeePC 1000H上运行Fedora 10

啊,我想我已经修好了。 这是因为我在“mtype”的结构中使用了一个int而不是long。 传入{1l,“hello”}而改变我的定义似乎已经解决了