我正在使用unix消息队列编写一个程序。问题是,程序报告我“错误:22:无效参数”。我已经检查过了,但这不能满足我的要求。下面是简单的代码:
bool msg::send(int key, void* data)
{
(void) data;
bool res = false;
m_msgId = msgget(key, m_mask);
if (m_msgId == -1) {
// noone create it
if ((m_msgId = msgget(key, m_mask | IPC_CREAT)) == -1) {
fprintf(stderr, "Error creating message: %d:(%s)\n",
errno,
strerror(errno));
return res;
}
}
union {
msg m;
char c[sizeof(msg)];
} u = {*this}; // it`s a deep copy
// here the program fails //
int ret = msgsnd(m_msgId, u.c,
sizeof(msg), IPC_NOWAIT);
if (ret == -1) {
if (errno != EAGAIN) {
// here is errno 22 //
fprintf(stderr, "Error creating message: %d:(%s)\n",
errno,
strerror(errno));
return res;
} else {
if (msgsnd(m_msgId, u.c,
sizeof(msg), 0) == -1) {
fprintf(stderr, "Error creating message: %d:(%s)\n",
errno,
strerror(errno));
res = false;
}
}
}
res = true;
return res;
}
如果我试着发送一个普通的字符串,比如“1234567”,就可以了。但是这个缓冲区发送失败了。我做错什么了?
谢谢。
最佳答案
msgsnd
的一个环境条件是"the value of mtype is less than 1"。msgsnd
预期发送缓冲区是一个长描述消息类型(mtype),后跟消息本身。您错误地没有设置消息类型,因此msgsnd
会将消息的第一个长字节解释为mtype。当消息"1234567"
但失败时,这种情况会发生。
你想定义如下:
struct mymsg {
long mtype;
char mtext[SUFFICIENTLY_LARGE];
};
并在显式设置mtype>=1的同时将消息复制到多行文字中的内存中。
关于c - Linux ipc msgsnd()失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40047214/