msgrcv获取空白消息

时间:2011-05-04 17:17:17

标签: c ipc msgrcv

我有两个程序通过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;
}



的msgsnd:

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 个答案:

答案 0 :(得分:1)

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

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

msgrcv将返回读取的字节数或错误的-1 ...您应该检查并查看实际发生的情况。

如果它为-1,则errno被设置,并且它可以告诉您许多事情。手册页列出了所有内容。