Brian Brown
Brian Brown

Reputation: 4311

Why I dont see a msg from message queue?

I would like to understand how message queues in Unix work. I wrote a simple code which sends a short message to queue and then I can read that message. But my code shows :

enter image description here

And I dont know why - and I cant see a message I send to queue. Heres my code:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>

struct mymsgbuf {
    long mtype;
    char mtext[1024];
}msg;

int send_message(int qid, struct mymsgbuf *buffer )
{
    int result = -1, length = 0;
    length = sizeof(struct mymsgbuf) - sizeof(long);
    if((result = msgsnd(qid, buffer, length, 0)) == -1)
        return -1;
    return result;
}

int read_message(int qid, long type, struct mymsgbuf *buffer)
{
    int result, length;
    length = sizeof(struct mymsgbuf) - sizeof(long);
    if((result = msgrcv(qid, buffer, length, type,  0)) == -1)
        return -1;
    printf("Type: %ld Text: %s\n", buffer->mtype, buffer->mtext);
    return result;
}

int main(int argc, char **argv)
{
    int buffsize = 1024;

    int qid = msgget(ftok(".", 0), IPC_CREAT | O_EXCL);
    if (qid == -1)
    {
        perror("msgget");
        exit(1);
    }

    msg.mtype = 1;
    strcpy(msg.mtext, "my simple msg");

    if((send_message(qid, &msg)) == -1)
    {
        perror("msgsnd");
        exit(1);
    }

    if((read_message(qid, 1, &msg) == -1))
    {
        perror("msgrcv");
        exit(1);
    }

    return 0;
}

When I changed a line with msgget for this line:

int qid = msgget(ftok(".", 0), IPC_CREAT | O_EXCL | 0600);

it shows:

enter image description here

Upvotes: 0

Views: 266

Answers (1)

Mat
Mat

Reputation: 206727

From the documentation for msgget:

The low-order 9 bits of msg_perm.mode shall be set equal to the low-order 9 bits of msgflg.

You need to add some permissions to your queue, at least read and write. Do something like:

int qid = msgget(ftok(".", 0), IPC_CREAT | O_EXCL | 0600);

Upvotes: 1

Related Questions