有人可以帮我指出程序中的错误吗?
提前致谢,
kingsmasher1
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <string.h>
#include <errno.h>
typedef struct msgbuf {
long mtype; /* message type, must be > 0 */
char mtext[15]; /* message data */
} msgbuf;
int main() {
key_t key;
int msqid, pid, length;
msgbuf buf;
msqid=msgget(IPC_PRIVATE,IPC_CREAT);
if(msqid==-1){
perror("msgget failed");
return;
}
else {
printf("msgget succeeded. ID:%u",msqid);
}
pid=fork();
if(pid==-1) {
perror("fork failed\n");
}
buf.mtype=1;
strcpy(buf.mtext, "This is a test message");
length=sizeof(buf.mtext);
if(msgsnd(msqid,&buf,length,0)!=0) {
perror("msgsnd failed:\n");
}
else {
printf("msgsnd succeeded\n");
}
}
输出:
msgsnd失败:参数无效
最佳答案
您的buf.mtext
(15个字符)中没有足够的空间来存放"This is a test message"
(对于NUL终止符,又增加了23个字符)。
我想说,很有可能破坏您的类型,甚至破坏堆栈上的其他信息(例如msqid
或length
或key
)。
不管这是不是实际的问题,它仍然是未定义的行为,应予以解决。我要做的第一件事是通过替换检查:
strcpy(buf.mtext, "This is a test message");
与:
strcpy(buf.mtext, "XYZZY"); // 5 plus the NUL
看看是否可以解决。
或者,使
mtext
足够大,以存储要放入其中的数据。关于c - 消息队列: msgsnd failed : Invalid argument,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5218238/