I have a program which creates a message queue and send a message (with mq_send()
) to this queue. then I try to open the same message queue to read the message from another process.
But mq_open()
returns -1.
open_and_write_MQ.c
JavaScript
x
#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 argumentn");
exit(0);
}
else
{
fd = mq_open(argv[1], O_CREAT | O_RDWR, 7777, &attr);
if(fd == -1)
{
printf("nCould not create a message queuen");
exit(0);
}
else
{
if(mq_send(fd, buff, sizeof(buff), 1) == -1)
{
printf("nCouldn't write message to the queuen");
mq_close(fd);
mq_unlink(argv[1]);
exit(0);
}
else
{
printf("n Message written to the queue sucussfullyn");
}
}
}
mq_close(fd);
printf("n waiting for other process to read the MQn");
getchar();
mq_unlink(argv[1]);
exit(0);
}
This creates the MQ. Below program tries to read the same MQ. open_and_read_MQ.c
JavaScript
#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 queuen");
exit(0);
}
else
{
fd = mq_open(argv[1], O_RDONLY);
if(fd == -1)
{
sterr = errno;
printf("nCouldn't open the message queue. Error : %sn",strerror(sterr));
exit(0);
}
else
{
if(mq_receive(fd, buff, sizeof(buff), NULL) == -1)
{
printf("nMessage could not be receivedn");
mq_close(fd);
exit(0);
}
else
{
printf("Received Message : %s",buff);
}
}
}
exit(0);
}
Compilation steps:
JavaScript
$ gcc open_and_read_MQ.c -lrt -o open_and_read_MQ
$ gcc open_and_write_MQ.c -lrt -o open_and_write_MQ
execution steps:
JavaScript
$ ./open_and_write_MQ /new
Message written to the queue sucussfully
waiting for other process to read the MQ
then run below program in some other terminal.
JavaScript
$ ./open_and_read_MQ /new
Couldn't open the message queue. Error : Permission denied
How can I set the permissions of process so that it can read the messages from message queue?
Advertisement
Answer
The problem is the line
JavaScript
fd = mq_open(argv[1], O_CREAT | O_RDWR, 7777, &attr);
7777
is not a number specified in octal. Use e.g. 0777
instead (or the S_I*
constants described in open(2)
). Those permissions might be overly broad though.