使用msgsnd / msgrcv发生奇怪的行为

时间:2016-02-18 14:30:07

标签: c linux ipc

我有两个不同的程序:

第一个,基本上是在无限循环中在消息队列上调用msgrcv并在收到某些内容时打印,在C ++中:

//foo1.cpp
#include <iostream>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>

typedef struct MessageBuffer {
        long mtype;
        char mtext[255];
} MessageBuffer;

int main() {
    key_t key = ftok("/tmp/toto1", 'b');
    int messageQueue = msgget(key, IPC_CREAT|0666);
    while (true) {
        MessageBuffer message;
        int ret = -1;
        while(ret < 0) {
            usleep(1000000);
            ret = msgrcv(messageQueue, (void*) (&message), sizeof(MessageBuffer)-sizeof(long), 0, 0);
        }
        std::cout << "message is:" << message.mtext << std::endl;
        std::cout << "ret is:" << ret << std::endl;
    }
    return 0;
}

编译:{{1​​}}

另一个只是在C:

中感谢g++ foo1.cpp -o foo1向同一个消息队列发送消息
msgsnd

编译:{{1​​}}

实际上,一切正常,我可以在foo1的控制台中看到它收到了foo2发送的消息。但如果我在foo2.c中取消注释该行,它就不再有效了,foo1也没有收到任何消息。

有没有人对此有解释?

我在Ubuntu 12.04上。 gcc和g ++ 4.6.3

1 个答案:

答案 0 :(得分:1)

您忘了查看返回值并初始化mtype(必须为正) 初始化mtype失败意味着在两种情况下都不会定义程序的行为 (当你声明另一个变量时,它可能是非正面的偶然。)

你的尺寸也过大了。

这应该有效:

MessageBuffer messageToSend = {1};
MessageBuffer anOtherMessage = {1};
strcpy(messageToSend.mtext, "foo message");
int result = msgsnd(messageQueue, &messageToSend, sizeof(messageToSend.mtext), 0);
if (result < 0)
{
    /* Handle the error. */
}