我用 C++ 写了一个 “消息队列”类 MsgQueue ,来包装 Linux 上的消息队列操作,成员方法主要是 push (对应 msgsnd )和 pop (对应 msgrcv ),创建消息队列时没错,但在 msgsnd 和 msgrcv 时总是返回 -1 。我猜可能是把 Msg 的地址传进去时有 ABI 的问题,请知道的朋友指点一下,非常感谢!
程序如下,分别是定义消息队列的头文件,发送者,接收者以及 Makefile.
// msgqueue.h
#ifndef MSGQUEUE_H
#define MSGQUEUE_H
#include <stdexcept>
#include <string>
#include <cstring>
#include <cstdio>
#include <sys/msg.h>
struct Msg {
long type;
char text[BUFSIZ];
Msg() {};
Msg(long typ, const char *txt) : type(typ) {
strncpy(text, txt, BUFSIZ - 1);
text[BUFSIZ - 1] = '\0';
}
};
class MsgQueue {
private:
int id_;
public:
MsgQueue(key_t key = 1235) {
int id = msgget(key, IPC_CREAT);
if (id == -1) {
throw std::runtime_error("Create message queue failed.");
}
printf("Message queue's id is %d.\n", id_);
id_ = id;
}
void push(const std::string &text, long type = 1) {
push(Msg(type, text.c_str()));
}
void push(const char *text, long type = 1) {
push(Msg(type, text));
}
void push(const Msg &msg) {
if (-1 == msgsnd(id_, &msg, BUFSIZ, 0)) { // 总返回 -1
throw std::runtime_error("Send message failed.");
}
}
Msg pop(long type = 1) {
Msg msg;
if (-1 == msgrcv(id_, &msg, BUFSIZ, type, 0)) {
throw std::runtime_error("Receive message failed.");
}
return msg;
}
};
#endif
// send.cpp
#include <iostream>
#include "msgqueue.h"
int main() {
MsgQueue Q;
std::string txt = "hell";
Q.push(txt.c_str());
std::cout << "Send message: " << txt << std::endl;
return 0;
}
// recv.cpp
#include <iostream>
#include "msgqueue.h"
int main() {
MsgQueue Q;
Msg msg = Q.pop();
std::cout << "Receive message: " << msg.text << std::endl;
return 0;
}
TARGET := $(patsubst %.cpp, %, $(wildcard *.cpp))
all: $(TARGET)
%: %.cpp $(wildcard *.h)
g++ $< -std=c++14 -g -o $@
clean:
rm -fr $(TARGET)
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.