Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C Linux:检查消息队列是否为空_C_Linux_Ipc_Message Queue - Fatal编程技术网

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

C Linux:检查消息队列是否为空,c,linux,ipc,message-queue,C,Linux,Ipc,Message Queue,我想知道队列消息是否为空。我使用了msg_ctl()如下,它不起作用: struct msqid_ds buf; int num_messages; rc = msgctl(msqid, IPC_STAT, &buf); 我使用了这个窥视功能: int peek_message( int qid, long type ) { int result, length; if((result = msgrcv( qid, NULL, 0, type, IPC_NOWAIT)

我想知道队列消息是否为空。我使用了msg_ctl()如下,它不起作用:

struct msqid_ds buf;
int num_messages;

rc = msgctl(msqid, IPC_STAT, &buf);
我使用了这个窥视功能:

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);
}
在这两种情况下,我在向队列发送消息之前和之后都会得到相同的结果


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

我编写了似乎工作正常的示例代码:

#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;
}
#包括
#包括
#包括
#包括
#包括
结构msgbuf{
long mtype;/*消息类型必须大于0*/
char mtext[1];/*消息数据*/
};
内部主(空){
int msqid;
//msqid=msgget(IPC|u PRIVATE,(IPC|u CREAT | IPC|u EXCL | 0600));
msqid=msgget((键)12350600 | IPC|u CREAT);
printf(“使用消息队列%d\n”,msqid);
结构msqid_ds buf;
int rc=msgctl(msqid、IPC_STAT和buf);
uint msg=(uint)(buf.msg_qnum);
printf(“发布前的消息:%u\n”,msg);
printf(“将消息发布到队列…\n”);
结构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(“post之后的消息:%u\n”,msg);
返回0;
}

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

“它不工作”?-它有什么作用?你收到错误信息了吗?它是否返回意外值?哪个值?我的意思是,我得到一个0消息的计数,在第一个实例中,你检查buf.msg_qnum?这还不清楚,因为您还有一个无法解释的“int num_messages”。