==============================================================
  Experiment 07: IPC Using Message Queues
==============================================================
  [Back to Index]
--------------------------------------------------------------

THEORY:
  System V Message Queues allow processes to exchange
  data as messages stored in a kernel-managed queue.

  System Calls:
    msgget() - Create/access message queue
    msgsnd() - Send a message
    msgrcv() - Receive a message
    msgctl() - Remove the queue

  AIM: Sender sends a string, receiver reverses it,
       sender checks if it's a palindrome.

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

PROGRAM 1: sender.c

--------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct message {
    long type;
    char text[100];
};

int main() {

    struct message msg;

    key_t key = 1234;

    int msgid = msgget(key, 0666 | IPC_CREAT);

    printf("Enter a string: ");
    scanf("%s", msg.text);

    char original[100];
    strcpy(original, msg.text);

    msg.type = 1;

    // Send string
    msgsnd(msgid, &msg, sizeof(msg.text), 0);

    // Receive reversed string
    msgrcv(msgid, &msg, sizeof(msg.text), 2, 0);

    printf("Reversed String: %s\n", msg.text);

    if (strcmp(original, msg.text) == 0)
        printf("Palindrome\n");
    else
        printf("Not Palindrome\n");

    // Remove message queue
    msgctl(msgid, IPC_RMID, NULL);

    return 0;
}
--------------------------------------------------------------

PROGRAM 2: receiver.c

--------------------------------------------------------------
#include <stdio.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>

struct message {
    long type;
    char text[100];
};

int main() {

    struct message msg;

    key_t key = 1234;

    int msgid = msgget(key, 0666);

    // Receive message
    msgrcv(msgid, &msg, sizeof(msg.text), 1, 0);

    printf("Received String: %s\n", msg.text);

    int len = strlen(msg.text);

    char rev[100];

    for (int i = 0; i < len; i++) {
        rev[i] = msg.text[len - i - 1];
    }

    rev[len] = '\0';

    strcpy(msg.text, rev);

    msg.type = 2;

    // Send reversed string back
    msgsnd(msgid, &msg, sizeof(msg.text), 0);

    return 0;
}
--------------------------------------------------------------

==============================================================
  [Prev: Exp 06]  |  [Next: Exp 08]
==============================================================