无法以读取模式打开消息队列 (mq_open())
Not able to open a message queue in read mode (mq_open())
我有一个程序可以创建消息队列并向该队列发送消息(使用 mq_send()
)。然后我尝试打开同一个消息队列来读取来自另一个进程的消息。
但是 mq_open()
returns -1.
open_and_write_MQ.c
#include <stdio.h>
#include <mqueue.h>
#include <stdlib.h>
#include <string.h>
#define LEN 50
int main(int argc, char * argv[])
{
struct mq_attr attr;
mqd_t fd;
char buff[LEN];
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = LEN;
attr.mq_curmsgs = 0;
memset(buff,0,LEN);
strcpy(buff,"This is just a test message");
if(argc < 2)
{
printf("\nPlease enter at least one argument\n");
exit(0);
}
else
{
fd = mq_open(argv[1], O_CREAT | O_RDWR, 7777, &attr);
if(fd == -1)
{
printf("\nCould not create a message queue\n");
exit(0);
}
else
{
if(mq_send(fd, buff, sizeof(buff), 1) == -1)
{
printf("\nCouldn't write message to the queue\n");
mq_close(fd);
mq_unlink(argv[1]);
exit(0);
}
else
{
printf("\n Message written to the queue sucussfully\n");
}
}
}
mq_close(fd);
printf("\n waiting for other process to read the MQ\n");
getchar();
mq_unlink(argv[1]);
exit(0);
}
这将创建 MQ。下面的程序尝试读取同一个 MQ。
open_and_read_MQ.c
#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <string.h>
#include <errno.h>
#define LEN 50
int main(int argc , char *argv[])
{
mqd_t fd;
char buff[LEN];
int sterr;
memset(buff,0,LEN);
if(argc < 2)
{
printf("\nPlease enter the name of message queue\n");
exit(0);
}
else
{
fd = mq_open(argv[1], O_RDONLY);
if(fd == -1)
{
sterr = errno;
printf("\nCouldn't open the message queue. Error : %s\n",strerror(sterr));
exit(0);
}
else
{
if(mq_receive(fd, buff, sizeof(buff), NULL) == -1)
{
printf("\nMessage could not be received\n");
mq_close(fd);
exit(0);
}
else
{
printf("Received Message : %s",buff);
}
}
}
exit(0);
}
编译步骤:
$ gcc open_and_read_MQ.c -lrt -o open_and_read_MQ
$ gcc open_and_write_MQ.c -lrt -o open_and_write_MQ
执行步骤:
$ ./open_and_write_MQ /new
Message written to the queue sucussfully
waiting for other process to read the MQ
然后 运行 在其他终端中的程序下面。
$ ./open_and_read_MQ /new
Couldn't open the message queue. Error : Permission denied
如何设置进程的权限,使其可以从消息队列中读取消息?
问题是线路
fd = mq_open(argv[1], O_CREAT | O_RDWR, 7777, &attr);
7777
不是八进制数。使用例如0777
代替(或 open(2)
中描述的 S_I*
常量)。不过,这些权限可能过于宽泛。
我有一个程序可以创建消息队列并向该队列发送消息(使用 mq_send()
)。然后我尝试打开同一个消息队列来读取来自另一个进程的消息。
但是 mq_open()
returns -1.
open_and_write_MQ.c
#include <stdio.h>
#include <mqueue.h>
#include <stdlib.h>
#include <string.h>
#define LEN 50
int main(int argc, char * argv[])
{
struct mq_attr attr;
mqd_t fd;
char buff[LEN];
attr.mq_flags = 0;
attr.mq_maxmsg = 10;
attr.mq_msgsize = LEN;
attr.mq_curmsgs = 0;
memset(buff,0,LEN);
strcpy(buff,"This is just a test message");
if(argc < 2)
{
printf("\nPlease enter at least one argument\n");
exit(0);
}
else
{
fd = mq_open(argv[1], O_CREAT | O_RDWR, 7777, &attr);
if(fd == -1)
{
printf("\nCould not create a message queue\n");
exit(0);
}
else
{
if(mq_send(fd, buff, sizeof(buff), 1) == -1)
{
printf("\nCouldn't write message to the queue\n");
mq_close(fd);
mq_unlink(argv[1]);
exit(0);
}
else
{
printf("\n Message written to the queue sucussfully\n");
}
}
}
mq_close(fd);
printf("\n waiting for other process to read the MQ\n");
getchar();
mq_unlink(argv[1]);
exit(0);
}
这将创建 MQ。下面的程序尝试读取同一个 MQ。 open_and_read_MQ.c
#include <stdio.h>
#include <stdlib.h>
#include <mqueue.h>
#include <string.h>
#include <errno.h>
#define LEN 50
int main(int argc , char *argv[])
{
mqd_t fd;
char buff[LEN];
int sterr;
memset(buff,0,LEN);
if(argc < 2)
{
printf("\nPlease enter the name of message queue\n");
exit(0);
}
else
{
fd = mq_open(argv[1], O_RDONLY);
if(fd == -1)
{
sterr = errno;
printf("\nCouldn't open the message queue. Error : %s\n",strerror(sterr));
exit(0);
}
else
{
if(mq_receive(fd, buff, sizeof(buff), NULL) == -1)
{
printf("\nMessage could not be received\n");
mq_close(fd);
exit(0);
}
else
{
printf("Received Message : %s",buff);
}
}
}
exit(0);
}
编译步骤:
$ gcc open_and_read_MQ.c -lrt -o open_and_read_MQ
$ gcc open_and_write_MQ.c -lrt -o open_and_write_MQ
执行步骤:
$ ./open_and_write_MQ /new
Message written to the queue sucussfully
waiting for other process to read the MQ
然后 运行 在其他终端中的程序下面。
$ ./open_and_read_MQ /new
Couldn't open the message queue. Error : Permission denied
如何设置进程的权限,使其可以从消息队列中读取消息?
问题是线路
fd = mq_open(argv[1], O_CREAT | O_RDWR, 7777, &attr);
7777
不是八进制数。使用例如0777
代替(或 open(2)
中描述的 S_I*
常量)。不过,这些权限可能过于宽泛。