无法删除消息队列C中的旧消息

时间:2017-12-15 19:28:27

标签: c key message-queue

我创建了一个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);

1 个答案:

答案 0 :(得分:0)

使用消息message queue使用

删除queue Id
ipcrm -q id

或使用message queue

删除key
ipcrm -Q key_num

从手册页“为了删除这些对象,您必须是超级用户,或者        该对象的ator或所有者。

最后,您可以使用IPC_RMID调用

中的msgctl()标记删除邮件队列
main()
{
        int total_mq,i,msqid;
        struct msqid_ds ds; //dataStructure holding complete info for indexed message que
        struct msginfo msginfo; //general buff copying data from MSG_INFO, has info of how many message que present right now
        /* Obtain size of kernel 'entries' array */
        total_mq = msgctl(0, MSG_INFO, (struct msqid_ds *) &msginfo); //copy kernel MSGQ_INFO to local buff
        //returns count of active message Q
        if (total_mq < 0)
        {
                perror("msgctl");
                return 0;
        }
        printf("no of active message queue(KEY) : %d\n", total_mq+1);
        /* Retrieve meaasge Queue id's */
        for (i = 0; i <= total_mq; i++)
        {
                msqid = msgctl(i, MSG_STAT, &ds); //from each index using MSG_STAT -> ds, return msgqid
                if (msqid <0 )
                {
                        perror("msgctl");
                        return 0;
                }
                /* using msgqid remove the message queue */
                if ( msgctl(msqid,IPC_RMID,0) < 0 )
                {
                        perror("msgctl");
                        return 0;
                }
        }
        printf("all message queues removed\n");
        return 0;
}

在运行上面的代码之前,创建一些消息队列,然后删除它们。