Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

संदेश कतारों का उपयोग कर आईपीसी

जब हमारे पास पहले से ही साझा मेमोरी है तो हमें संदेश कतारों की आवश्यकता क्यों है? यह कई कारणों से होगा, आइए हम इसे सरलीकरण के लिए कई बिंदुओं में विभाजित करने का प्रयास करें -

  • जैसा कि समझा जाता है, एक बार एक प्रक्रिया द्वारा संदेश प्राप्त हो जाने के बाद यह किसी अन्य प्रक्रिया के लिए उपलब्ध नहीं होगा। जबकि साझा स्मृति में, डेटा कई प्रक्रियाओं तक पहुंचने के लिए उपलब्ध है।

  • अगर हम छोटे संदेश प्रारूपों के साथ संवाद करना चाहते हैं।

  • जब एक ही समय में कई प्रक्रियाएं संचार करती हैं, तो साझा स्मृति डेटा को सिंक्रनाइज़ेशन के साथ संरक्षित करने की आवश्यकता होती है।

  • साझा मेमोरी का उपयोग करके लिखने और पढ़ने की आवृत्ति अधिक है, तो कार्यक्षमता को लागू करना बहुत जटिल होगा। इस तरह के मामलों में उपयोग के लायक नहीं है।

  • क्या होगा यदि सभी प्रक्रियाओं को साझा स्मृति तक पहुंचने की आवश्यकता नहीं है लेकिन बहुत कम प्रक्रियाओं को केवल इसकी आवश्यकता है, संदेश कतारों के साथ कार्यान्वित करना बेहतर होगा।

  • अगर हम अलग-अलग डेटा पैकेट के साथ संवाद करना चाहते हैं, तो कहें कि प्रक्रिया ए, बी को संसाधित करने के लिए संदेश प्रकार 1 भेज रहा है, संदेश प्रकार 10 को संसाधित करने के लिए संदेश प्रकार 20 भेज रहा है, और इस मामले में, संदेश कतारों के साथ कार्यान्वित करना आसान है। दिए गए संदेश प्रकार को 1, 10, 20 के रूप में सरल बनाने के लिए, यह या तो 0 या +ve या -ve हो सकता है जैसा कि नीचे चर्चा की गई है।

  • बेशक, संदेश कतार का क्रम फीफो (फर्स्ट इन फर्स्ट आउट) है। कतार में डाला गया पहला संदेश पुनर्प्राप्त किया जाने वाला पहला संदेश है।

साझा स्मृति या संदेश कतारों का उपयोग करना इस बात पर निर्भर करता है कि आवेदन की आवश्यकता क्या है और इसका कितना प्रभावी ढंग से उपयोग किया जा सकता है।

संदेश कतारों का उपयोग करके संचार निम्नलिखित तरीकों से हो सकता है -

  • एक प्रक्रिया द्वारा साझा स्मृति में लिखना और दूसरी प्रक्रिया द्वारा साझा स्मृति से पढ़ना। जैसा कि हम जानते हैं, पठन कई प्रक्रियाओं के साथ भी किया जा सकता है।
    संदेश कतारों का उपयोग कर आईपीसी

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

संदेश कतारों का उपयोग कर आईपीसी

संदेश कतारों पर कुछ जानकारी देखने के बाद, अब सिस्टम कॉल (सिस्टम V) की जांच करने का समय है जो संदेश कतारों का समर्थन करता है।

संदेश कतारों का उपयोग करके संचार करने के लिए, निम्नलिखित चरण हैं -

चरण 1 - एक संदेश कतार बनाएं या पहले से मौजूद संदेश कतार से कनेक्ट करें (msgget ())

चरण 2 - संदेश कतार में लिखें (msgsnd ())

चरण 3 - संदेश कतार से पढ़ें (msgrcv ())

चरण 4 - संदेश कतार पर नियंत्रण संचालन करें (msgctl ())

यहां हम दो प्रोसेस बनाएंगे। एक लिख सकता है और दूसरा पढ़ सकता है। आइए देखें कि साझा स्मृति का उपयोग करके पाठक और लेखक की प्रक्रियाएं कैसे काम कर रही हैं।

उदाहरण कोड

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// structure for message queue
struct msg_buffer {
   long msg_type;
   char msg[100];
} message;
main() {
   key_t my_key;
   int msg_id;
   my_key = ftok("progfile", 65); //create unique key
   msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id
   message.msg_type = 1;
   printf("Write Message : ");
   fgets(message.msg, 100, stdin);
   msgsnd(msg_id, &message, sizeof(message), 0); //send message
   printf("Sent message is : %s \n", message.msg);
}

उदाहरण कोड

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/msg.h>
// Define message queue structure
struct msg_buffer {
   long msg_type;
   char msg[100];
} message;
main() {
   key_t my_key;
   int msg_id;
   my_key = ftok("progfile", 65); //create unique key
   msg_id = msgget(my_key, 0666 | IPC_CREAT); //create message queue and return id
   msgrcv(msg_id, &message, sizeof(message), 1, 0); //used to receive message
   // display the message
   printf("Received Message is : %s \n", message.msg);
   msgctl(msg_id, IPC_RMID, NULL); //destroy the message queue
   return 0;
}

आउटपुट

संदेश कतारों का उपयोग कर आईपीसी


  1. सी ++ कतार का उपयोग करके बीएसटी में पथ को उलट दें

    एक बाइनरी सर्च ट्री को देखते हुए, और उदाहरण के लिए, हमें किसी विशेष कुंजी से इसके पथ को उलटने की आवश्यकता होती है। समाधान खोजने के लिए दृष्टिकोण इस दृष्टिकोण में, हम एक कतार बनाएंगे और सभी नोड्स को तब तक धकेलेंगे जब तक हमें रूट नहीं मिल जाता। उदाहरण   #include <bits/stdc++.h> using n

  1. सी ++ में डबल लिंक्ड सूची का उपयोग कर प्राथमिकता कतार

    हमें डेटा और प्राथमिकता एक पूर्णांक मान के रूप में दी जाती है और कार्य दी गई प्राथमिकता के अनुसार एक डबल लिंक्ड सूची बनाना और परिणाम प्रदर्शित करना है। Queue एक FIFO डेटा संरचना है जिसमें जो तत्व पहले डाला जाता है वह सबसे पहले निकाला जाता है। प्राथमिकता कतार एक प्रकार की कतार है जिसमें प्राथमिकता क

  1. Truecaller का उपयोग करके संदेशों को कैसे शेड्यूल करें

    क्या आपको कभी किसी का जन्मदिन भूलने के अफसोस का सामना करना पड़ा है? हकीकत यह है कि आखिर आप इंसान हैं, और कभी-कभी आप महत्वपूर्ण तारीखें भूल जाते हैं, यहां तक ​​कि अपने प्रियजनों की भी। सौभाग्य से, आपको किसी विशेष अवसर को भूलना नहीं है क्योंकि Truecaller आपको समय से पहले संदेश भेजने की अनुमति देता है