消息队列:msgsnd失败:参数无效

时间:2011-03-07 10:01:20

标签: c linux message-queue

有谁可以帮我指出我的程序中的错误是什么?

提前致谢, 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失败:参数无效

1 个答案:

答案 0 :(得分:8)

buf.mtext {15}中"This is a test message"(15个字符)没有足够的空间(对于NUL终结符,其余23个字符)。

我认为很可能会破坏您的类型甚至是某些其他信息在堆栈上(例如msqidlength或{{ 1}})。

这是否是实际问题,它仍然是未定义的行为,应该修复。我要做的第一件事就是通过替换来检查:

key

使用:

strcpy(buf.mtext, "This is a test message");

看它是否修复了它。

或者,将strcpy(buf.mtext, "XYZZY"); // 5 plus the NUL 大到足以存储您放在那里的数据。