首先,我试图创建一个消息队列。但是我只能在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
最好的问候, 云芝