जब हमारे पास पहले से शेयर्ड मेमोरी है तो हमें मैसेज क्यू की आवश्यकता क्यों है? यह कई कारणों से होगा, आइए इसे सरलीकरण के लिए कई बिंदुओं में तोड़ने की कोशिश करते हैं -
जैसा कि समझा गया, एक बार मैसेज किसी प्रोसेस द्वारा प्राप्त हो जाने पर यह किसी अन्य प्रोसेस के लिए उपलब्ध नहीं होगा। जबकि शेयर्ड मेमोरी में, डेटा कई प्रोसेसेज द्वारा एक्सेस के लिए उपलब्ध होता है।
यदि हम छोटे मैसेज फॉर्मेट के साथ संवाद करना चाहते हैं।
शेयर्ड मेमोरी डेटा को सिंक्रोनाइज़ेशन के साथ संरक्षित करने की आवश्यकता होती है जब कई प्रोसेस एक ही समय पर संवाद कर रहे हों।
शेयर्ड मेमोरी का उपयोग करके लिखने और पढ़ने की आवृत्ति अधिक है, तो कार्यक्षमता को लागू करना बहुत जटिल होगा। इस तरह के मामलों में उपयोग के संबंध में उचित नहीं।
क्या होगा यदि सभी प्रोसेस को शेयर्ड मेमोरी एक्सेस करने की आवश्यकता नहीं है लेकिन बहुत कम प्रोसेस को ही इसकी आवश्यकता है, तो मैसेज क्यू के साथ लागू करना बेहतर होगा।
यदि हम अलग-अलग डेटा पैकेट्स के साथ संवाद करना चाहते हैं, मान लीजिए प्रोसेस A प्रोसेस B को मैसेज टाइप 1 भेज रहा है, मैसेज टाइप 10 प्रोसेस C को, और मैसेज टाइप 20 प्रोसेस D को। इस मामले में, मैसेज क्यू के साथ लागू करना सरल है। दिए गए मैसेज टाइप को 1, 10, 20 के रूप में सरल बनाने के लिए, यह 0 या +ve या -ve हो सकता है जैसा कि नीचे चर्चा की गई है।
बेशक, मैसेज क्यू का क्रम FIFO (फर्स्ट इन फर्स्ट आउट) है। क्यू में डाला गया पहला मैसेज पहला है जिसे पुनर्प्राप्त किया जाता है।
शेयर्ड मेमोरी या मैसेज क्यू का उपयोग एप्लिकेशन की आवश्यकता पर निर्भर करता है और इसे कितनी प्रभावी ढंग से उपयोग किया जा सकता है।
मैसेज क्यू का उपयोग करके संचार निम्नलिखित तरीकों से हो सकता है -
एक प्रोसेस द्वारा शेयर्ड मेमोरी में लिखना और दूसरे प्रोसेस द्वारा शेयर्ड मेमोरी से पढ़ना। जैसा कि हम जानते हैं, पढ़ना कई प्रोसेस द्वारा भी किया जा सकता है।

एक प्रोसेस द्वारा अलग-अलग डेटा पैकेट्स के साथ शेयर्ड मेमोरी में लिखना और कई प्रोसेस द्वारा पढ़ना, यानी मैसेज टाइप के अनुसार।

मैसेज क्यू पर कुछ जानकारी देखने के बाद, अब सिस्टम कॉल (सिस्टम V) की जांच करने का समय है जो मैसेज क्यू का समर्थन करता है।
मैसेज क्यू का उपयोग करके संचार करने के लिए, निम्नलिखित चरण हैं -
चरण 1 - मैसेज क्यू बनाएं या पहले से मौजूद मैसेज क्यू से कनेक्ट करें (msgget())
चरण 2 - मैसेज क्यू में लिखें (msgsnd())
चरण 3 - मैसेज क्यू से पढ़ें (msgrcv())
चरण 4 - मैसेज क्यू पर कंट्रोल ऑपरेशन करें (msgctl())
यहां हम दो प्रोसेस बनाएंगे। एक लिख सकता है और दूसरा पढ़ सकता है। आइए देखते हैं कि रीडर और राइटर प्रोसेस शेयर्ड मेमोरी का उपयोग करके कैसे काम कर रहे हैं।
उदाहरण कोड (राइटर)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// मैसेज क्यू के लिए स्ट्रक्चर
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t my_key;
int msg_id;
my_key = ftok("progfile", 65); // यूनिक की बनाएं
msg_id = msgget(my_key, 0666 | IPC_CREAT); // मैसेज क्यू बनाएं और आईडी लौटाएं
message.msg_type = 1;
printf("Write Message: ");
fgets(message.msg, 100, stdin);
msgsnd(msg_id, &message, sizeof(message), 0); // मैसेज भेजें
printf("Sent message is: %s \n", message.msg);
return 0;
}
उदाहरण कोड (रीडर)
#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// मैसेज क्यू स्ट्रक्चर परिभाषित करें
struct msg_buffer {
long msg_type;
char msg[100];
} message;
int main() {
key_t my_key;
int msg_id;
my_key = ftok("progfile", 65); // यूनिक की बनाएं
msg_id = msgget(my_key, 0666 | IPC_CREAT); // मैसेज क्यू बनाएं और आईडी लौटाएं
msgrcv(msg_id, &message, sizeof(message), 1, 0); // मैसेज प्राप्त करने के लिए उपयोग किया जाता है
// मैसेज प्रदर्शित करें
printf("Received Message is: %s \n", message.msg);
msgctl(msg_id, IPC_RMID, NULL); // मैसेज क्यू नष्ट करें
return 0;
}
आउटपुट
