Linux:检查消息队列是否为空

12

我想知道一个队列消息是否为空。我已经使用了如下所示的msg_ctl(),但它没有起作用:

struct msqid_ds buf;
int num_messages;

rc = msgctl(msqid, IPC_STAT, &buf);

我使用了这个peek函数:

int peek_message( int qid, long type )
{
    int result, length;
    if((result = msgrcv( qid, NULL, 0, type, IPC_NOWAIT)) == -1) {
        if(errno==E2BIG)
            return(1);
    }

    return(0);
}

在两种情况下,在向队列发送消息之前和之后,我得到了相同的结果。

消息成功到达队列,我通过读取我发送的内容进行了测试。


“它不起作用”?- 它做什么?您是否收到错误消息?它是否返回意外值?哪个值? - sehe
我的意思是,我得到了0条消息的计数。 - Marwan Tushyeh
1
你是在第一次检查buf.msg_qnum吗?这并不清楚,因为你还有一个未解释的“int num_messages”。 - Duck
1个回答

3

我写了一份样例代码,看起来是能够正常工作的:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <errno.h>

struct msgbuf {
    long mtype;       /* message type, must be > 0 */
    char mtext[1];    /* message data */
};

int main(void) {
    int msqid;
    //msqid = msgget(IPC_PRIVATE, (IPC_CREAT | IPC_EXCL | 0600));
    msqid = msgget((key_t)1235, 0600 | IPC_CREAT);

    printf("Using message queue %d\n", msqid);
    struct msqid_ds buf;

    int rc = msgctl(msqid, IPC_STAT, &buf);

    uint msg = (uint)(buf.msg_qnum);
    printf("# messages before post: %u\n", msg);

    printf("Posting message to queue...\n");
    struct msgbuf qmsg;
    qmsg.mtype = 100;
    qmsg.mtext[0] = 'T';

    int res = msgsnd(msqid, &qmsg, 1, MSG_NOERROR);

    rc = msgctl(msqid, IPC_STAT, &buf);

    msg = (uint)(buf.msg_qnum);
    printf("# messages after post: %u\n", msg);

    return 0;
}

也许这对你有帮助?当使用此代码时,队列上的消息数量似乎会正确增加。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接