我有两个不同的程序:
第一个,基本上是在无限循环中在消息队列上调用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
答案 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. */
}