是否必须对同一消息队列的所有mq_open使用相同的标志?

时间:2018-09-18 16:21:10

标签: message-queue

首先,我试图创建一个消息队列。但是我只能在mq_open中使用O_WRONLY,否则,mq_open()会失败,并显示错误号13。

test.cpp就像:

#include <iostream>
#include <cstring>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <unistd.h>
#include <fcntl.h>           /* For O_* constants */
#include <sys/stat.h>        /* For mode constants */
#include <mqueue.h>
#include <errno.h>

using namespace std;
const char* hdcpTxMq = "/E_MSG_QUEUE";
static struct mq_attr txMqAttr;

int main(void)
{
    int len = 0, maxlen = 550;
    char buffer[maxlen];
    const char* msg_ptr = &buffer[0];
    int ret = 0;

    txMqAttr.mq_flags = 0;
    txMqAttr.mq_maxmsg = 10; 
    txMqAttr.mq_msgsize = 550;
    txMqAttr.mq_curmsgs = 0;

    // create a message queue
    mqd_t tx_mq = mq_open(hdcpTxMq, O_CREAT|O_RDWR, 644, &txMqAttr);
    if (tx_mq == (mqd_t)-1) {
        cout << "main(): failed to open queue. errno: " << errno << endl;
    }   
}

构建命令:

g++ test.cpp -lrt

输出:

-> ./a.out
main(): failed to open queue. errno: 13

如果使用O_WRONLY,则不会出现此类错误。


经过更多实验后,发现这是因为之前使用了相同的消息队列名称,并且标记为O_WRONLY。即,存在一个打开的带有标志O_WRONLY的消息队列。如果在打开前取消该队列的链接,则可以使用任何标志进行新的打开。

问题是:至少在同一过程中,同一消息队列的所有mq_open必须使用相同的标志吗?我知道在我的应用程序中,某些地方应用程序仅发送消息,并且在另一个地方,应用程序只接收消息,这就是为什么我尝试使用不同的标志打开同一队列的原因...

test02.cpp:

const char* hdcpTxMq = "/anonym_Queue";

int main(void)
{
    mq_unlink(hdcpTxMq);

    mqd_t tx_mq = mq_open(hdcpTxMq, O_CREAT | O_RDWR, 666, NULL);
    if (tx_mq == (mqd_t)-1) {
        cout << "main(): failed to open queue. errno: " << errno << endl;
    }

    mqd_t rx_mq = mq_open(hdcpTxMq, O_RDONLY); 
    if (rx_mq == (mqd_t)-1) {
        cout << "main(): failed to open rx queue. errno: " << errno << endl;
    }

    if (tx_mq != (mqd_t)-1) {
        mq_close(tx_mq);
    }
    if (rx_mq != (mqd_t)-1) {
        mq_close(tx_mq);
    }
}

test02.cpp的输出:

->./test
main(): failed to open rx queue. errno: 13

最好的问候, 云芝

0 个答案:

没有答案