msgrcv 收到空白消息

Posted

技术标签:

【中文标题】msgrcv 收到空白消息【英文标题】:msgrcv getting blank messages 【发布时间】:2011-05-04 17:17:16 【问题描述】:

我有两个程序通过 IPC 队列来回发送和接收消息。但是,有时 msgrcv 函数会收到一条空白消息,而不是接收实际通过队列发送的消息。我已经注释掉了一个我认为应该可行的修复程序,但我想在这里检查一下,看看这是否是使用 msgrcv 和 msgsnd 的正确方法。

msgrcv:

int readqueue(int qid, long type, char *msg)

    int retval;

    // Current fix for blank messages
    /* strcpy(MsgQueue.Message, "");

    while (strcmp(MsgQueue.Message, "") == 0)
    
        retval = msgrcv(qid, &MsgQueue, MSGSIZE, (long)type, 0);

        if (strcmp(MsgQueue.Message, "") == 0)
            printf("msgrcv fail\n");
    */

    retval = msgrcv(qid, &MsgQueue, MSGSIZE, (long)type, 0);
    strcpy(msg, MsgQueue.Message);

    return retval;

消息:

int sendqueue(int qid, long type, char *msg)

    struct msqid_ds stat_buf, *pstat_buf;
    int av, retval;

    pstat_buf = &stat_buf;
    av = 0;

    /* Make sure there's space in the queue */
    do 
                    
        retval = msgctl( qid, IPC_STAT, pstat_buf);
        if (retval == -1) 
        
            fprintf(stderr, "msgctl in sendqueue failed!  Error = %d\n", errno);
            return retval;
        
     while ( pstat_buf->msg_qbytes - pstat_buf->msg_cbytes == 0);

    strcpy(MsgQueue.Message, msg);
    MsgQueue.MsgType = (long)type;

    retval = msgsnd(qid, &MsgQueue, MSGSIZE, 0);

    memset(MsgQueue.Message, '\0', MSGSIZE-1);
    return retval;

【问题讨论】:

【参考方案1】:

你说:“但是,有时 msgrcv 函数会得到一个空白消息,而不是接收到实际通过队列发送的消息”

我建议找出实际发生的情况作为调试问题的方法。

msgrcv 将返回读取的字节数或-1 出错...您应该检查一下,看看实际发生了什么。

如果它是 -1,errno 被设置,它可以告诉你很多事情。手册页列出了所有这些。

【讨论】:

msgrcv 接收 128 个字节,这是为队列消息设置的最大字节大小。然而,字符串似乎仍然不时出现空白。

以上是关于msgrcv 收到空白消息的主要内容,如果未能解决你的问题,请参考以下文章

询问 msgrcv ,不适用于根据优先级接受消息

Linux进程间通信 -- 消息队列 msgget()msgsend()msgrcv()msgctl()

Linux环境下 消息队列编程 碰到些问题 msgsnd发送10个数据,msgrcv只能接受9个,第一个接受不到

消息队列

Codeigniter 显示空白页而不是错误消息

进程通信之消息队列