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
#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
#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:
$ 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:
$ ./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.
$ ./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
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.