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
}
--------------------------------------------------------
Related Questions
drjack9650@gmail.com
Navigate
Integrity-first tutoring: explanations and feedback only — we do not complete graded work. Learn more.