我的队列正在发送消息,但它没有收到...
任何人都可以帮助解决问题。
编者注:改进了代码格式,但需要更多细节
代码:
#define MAXSIZE 128
void die(char *s)
{
perror(s);
exit(1);
}
struct msgbuf
{
int mtype;
char mtext[MAXSIZE];
};
- > main()的
main()
{
int msqid;
int msgflg = IPC_CREAT | 0666;
key_t key;
struct msgbuf sbuf;
struct msgbuf rcvbuffer;
int buflen;
srand(time(0));
key = rand()%(100+40);
printf("%d",key);
获取给定密钥的消息队列ID
if ((msqid = msgget(key, msgflg )) < 0) //Get the message queue ID for the given key
die("msgget");
//Message Type
sbuf.mtype = 1;
printf("Enter a message to add to message queue : ");
scanf("%[^\n]",sbuf.mtext);
getchar();
buflen = strlen(sbuf.mtext) + 1 ;
if (msgsnd(msqid, &sbuf, buflen, IPC_NOWAIT) < 0)
{
printf ("%d, %d, %s, %d\n", msqid, sbuf.mtype, sbuf.mtext, buflen);
die("msgsnd");
}
else
printf("Message Sent\n");
printf("%d",msqid);
exit(0);
if ((msqid = msgget(key, 0666)) < 0)
die("msgget()");
收到消息类型1的答案。
//Receive an answer of message type 1.
if (msgrcv(msqid, &rcvbuffer, MAXSIZE, 1, 0) < 0)
die("msgrcv");
printf("%s\n", rcvbuffer.mtext);
}
由于
答案 0 :(得分:0)
我花了一些时间,但我发现了你的错误。消息队列的类型检查取决于long类型的mtype字段而不是int。
如果您只是在没有指定类型的情况下收到消息,它就会通过。但是如果指定类型,则不会,因为“struct msgbuf”中的“mtype”字段是int类型而不是long类型。 (在我的 - 很可能是你的 - 架构上,两者之间有4个字节的差异)
将struct msgbuf中的mtype类型更改为long,它将起作用...