Featured Post

Monday, September 26, 2016

IPC using Message Queue




                     Inter process communication can be achieved  using message queue. Using pipes the messages sent and received must be in FIFO order. Using message queue we can send and receive messages in a random way depending on the situation.

msgget(): To create a message queue we use msgget() system call. It takes the following arguments.

    semget(int key,msgflags);
    
   ex:   msgget(12344,IPC_CREAT|0666);

msgsnd(): This system call is used to place data in a message queue.

                          msgsnd(msqid, &sbuf, buflen,0);             /* struct msgbuf sbuf */
                   
msgrcv(): This system call is used to receive data from the message queue

                   msgrcv(msqid, &rcvbuffer, string length, 1, 0) 

msgctl(): This system call is used to get the status information of the message queue or to remove the                 message queue
       
               msgctl(int msgqid,int cmd,struct msgqid_ds *buf);

/* message queue program to send data on to message queue*/

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define MAXSIZE     128


struct msgbuf
{
    long    mtype;
    char    mtext[MAXSIZE];
};
main()
{
    int msqid;
    int msgflg = IPC_CREAT | 0666;
    key_t key;
    struct msgbuf sbuf;
    size_t buflen;

    key = 123555;

    if ((msqid = msgget(key, msgflg )) < 0)   //Get the message queue ID for the given key


    printf("eorror");

    //Message Type
    sbuf.mtype = 1;

    printf("Enter a message to add to message queue : ");
    scanf("%s",sbuf.mtext);
    getchar();

    buflen = strlen(sbuf.mtext) + 1 ;

    if (msgsnd(msqid, &sbuf, buflen, IPC_NOWAIT) < 0)
    {
             printf("error");
    }

    else
 printf("Message Sent\n");

    exit(0);
}

output:      /home/anil~$ cc msgsnd.c
            /home/anil~$ ./a.out
            Enter a message to add to message queue: hi hello
            Message Sent


/*message queue program to receive message from the message queue*/

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE     128


struct msgbuf
{
    long    mtype;
    char    mtext[MAXSIZE];
};
main()
{
    int msqid;
    key_t key;
    struct msgbuf rcvbuffer;

    key = 123555;

    if ((msqid = msgget(key, 0666)) < 0)
       printf("message queue cannot be created");


     //Receive an answer of message type 1.
    if (msgrcv(msqid, &rcvbuffer, MAXSIZE, 1, 0) < 0)
      printf("\n error in reading the message from the message queue");

    printf("%s", rcvbuffer.mtext);
    exit(0);
}


output: /home/anil~$ cc msgq_rcv.c
             /home/anil~$ ./a.out
            hi hello



IPC using message queue, msgget(),msgsnd(),msgrcv() IPC flags, client server program to send and receive messages, message structure, mtype, ftok(),key_t key, <ipc/stat.h>. difference between pipes and message queue

No comments:

Post a Comment