Academic Integrity: tutoring, explanations, and feedback — we don’t complete graded work or submit on a student’s behalf.

Hello I am working on a C program for an IPC, this is my assignment below: IPCs:

ID: 3673583 • Letter: H

Question

Hello I am working on a C program for an IPC, this is my assignment below:

IPCs: this exercise has 2 parts. In each case you are to write a server to initialize the IPC structure, and then fork a client (which you also write) to process the structure created. 1) Write a server and client for message queues. The server should enqueue several messages (the message data can be a string of characters), and the client should dequeue it and write the message data read to an output file.

Please help me with this!!

Explanation / Answer

Message Queue: In IPC (Inter-Proces Communication), a message queue can be assumed as a linked list of messages. Processes (threads) with sufficient privileges can add messages to the queue, while processes with sufficient privileges can delete messages from the queue.

Normally in a message queue, a message is a record with a assigned priority. Unlike pipes and FIFOs, there is no need of concurrent processes to handle IPC through message queues. A process (server process in your case) can wirte some messages to the queue and terminate. At a later time, another process (client process in your case) can read those messages.

Requirements for server process:

1. Create the messge queue

2. Set the attributes of message queue, if required.

3. Add (enqueue) messages to queue.

4. Close the message queue

Requirements for client process:

1. Open the message queue.

2. Read (dequeue) message queue.

3. Close the message queue.

4. Unlink the queue, if required.

Below is the code for both the processes:

1. Server process (server.c):

---------------------------------------------

#include <unpipc.h>
#include <stdlib.h>
#include <string.h>

struct mq_attr attr; //structure for attributes of message queue

//creates a message queue
mqd_t create_message_queue(char* queuename, int maxmsg, int msgsize)
{
   int flags;
   mqd_t mqd; //message queue descriptor

   flags = O_RDWR|O_CREAT|O_EXCL; //flags for message queue

   attr.mq_maxmsg=atol(maxmsg); //sets max. message allowed
   attr.mq_msgsize=atol(msgsize);   //sets max. size of a message

   mqd = Mq_open(queuename,flags,FILE_MODE,(attr.mq_maxmsg!=0)?&attr:NULL); //opens message queue

   return mqd;
}

//adds a message to the message queue
void add_message(mqd_t mqd, char* message, int msglen,int priority)
{
   void *ptr;
   size_t len;
   uint_t prio;

   len=msglen; //message length
   prio=priority; //message priority
   ptr=Calloc(len,sizeof(char));
   strcpy(ptr,message); //message to be added

   //adds the message to queue
   Mq_send(mqd,ptr,len,prio);
}

int main(int argc, char **argv)
{
   //parameters required to create a queue.
   char* queuename="queue"; //name of queue
   int maxmsg=1024; //max. messages allowed in queue
   int msgsize=8192; //max. size of a message

   mqd_t mqd; //message queue descriptor

   //messages to be added to the queue. You can change these.
   char* msg1="Message1";
   char* msg2="Message2";
   char* msg3="Message3";

   //priorities of the messages to be added to the queue. You can change these.
   int priorities[3]={1,2,3};

   //creates message queue
   mqd=create_message_queue(queuename,maxmsg,msgsize);

   //adds messages to queue
   add_message(mqd,msg1,strlen(msg1),priorities[0]);
   add_message(mqd,msg2,strlen(msg2),priorities[1]);
   add_message(mqd,msg3,strlen(msg3),priorities[2]);

   Mq_close(mqd); //closes the message queue
}

---------------------------------------------

2. Client process (client.c):

-----------------------------------------------

//opens a message queue
mqd_t open_message_queue(char* queuename)
{
   int flags;
   mqd_t mqd; //message queue descriptor

   flags = O_RDONLY|O_NONBLOCK; //flags for message queue

   mqd = Mq_open(queuename,flags); //opens message queue

   return mqd;
}

//reads a message from the message queue
void read_message(mqd_t mqd, int priority)
{
   void *buff; //buffer for message
   ssize_t n; //no. of bytes read from queue
   uint_t prio;
    struct mq_attr attr; //attributes of message queue

   Mq_getattr(mqd,&attr); //reads attributes of message queue
    prio=priority; //message priority

    buff=Malloc(attr.mq_msgsize); //allocates buffer

    //reads message
    n=Mq_receive(mqd,buff,attr.mq_msgsize,&prio);
    printf("Message:%s, priority:%d ",buff,priority); //it can be written to a file also.
}

int main(int argc, char **argv)
{
   //parameters required to open a queue.
   char* queuename="queue"; //name of queue


   mqd_t mqd; //message queue descriptor

   //opens message queue
   mqd=create_message_queue(queuename);

   //reads a message from queue
   read_message(mqd,1);

   Mq_close(mqd); //closes the message queue
}

--------------------------------------------------------

Hire Me For All Your Tutoring Needs
Integrity-first tutoring: clear explanations, guidance, and feedback.
Drop an Email at
drjack9650@gmail.com
Chat Now And Get Quote