【发布时间】:2017-12-16 04:02:52
【问题描述】:
我创建了一个 msq 让两个进程相互通信。问题是我遇到了一些问题,因为在我运行我的代码几次之后,出现了一些以前执行的旧消息。这让我很困扰,因为我需要对当前数据执行控制,因此无法做到。我尝试了 irpcm -q msqid 但它没有做任何事情,除了在我下次运行它时关闭我的程序。我什至尝试对一些键进行硬编码,认为它会有所帮助但没有任何帮助。在我完成使用队列后还尝试了 msgctl(msqid, IPC_RMID, 0) 但没有。希望您能帮助我并提前感谢。
这是我的代码:
sender.c
#define MAXSIZE 1024
struct msgbuf
{
long mtype;
char mtext[MAXSIZE];
};
void die(char *s)
{
perror(s);
exit(1);
}
int msqid1;
int msgflg = IPC_CREAT | 0666;
key_t keymq1;
struct msgbuf sbuf;
size_t buflen;
keymq1 = 668;
sbuf.mtype = 1;
if ((msqid1 = msgget(keymq1, msgflg )) < 0)
die("msgget");
sbuf.mtype = 1;
strcpy(sbuf.mtext,"my message");
buflen = strlen(sbuf.mtext) + 1 ;
if (msgsnd(msqid1, &sbuf, buflen, IPC_NOWAIT) < 0)
{
printf ("%d, %ld, %s, %zu\n", msqid1, sbuf.mtype, sbuf.mtext, buflen);
die("msgsnd");
}
else {
printf("Message sent\n");
}
receiver.c
#define MAXSIZE 1024
struct msgbuf
{
long mtype;
char mtext[MAXSIZE];
};
void die(char *s)
{
perror(s);
exit(1);
}
int msqid;
key_t keymq1;
struct msgbuf rcvbuffer;
keymq1 = 668;
if ((msqid = msgget(keymq1, 0666)) < 0)
die("msgget()");
if (msgrcv(msqid, &rcvbuffer, MAXSIZE, 1, 0) < 0)
die("msgrcv");
printf("Message received: %s\n", rcvbuffer.mtext);
【问题讨论】:
-
首先应该是
root(su)模式。您无法删除哪条消息queue id? -
队列 id 是 65536,我已经尝试通过 ipcrm 删除它但它仍然给我带来问题
-
使用
ipcrm -q 65536否则使用key删除?
标签: c key message-queue