लिनक्स कर्नेल में एक संदेश कतार कैसे लागू की जाती है?


29

मैं यह जानना चाहूंगा कि लिनक्स कर्नेल में संदेश कतारें कैसे कार्यान्वित की जाती हैं।


IPC_NOWAIT हम इसका उपयोग केवल पुनरावर्ती में करते हैं
अनवर Qa

जवाबों:


41

लिनक्स कर्नेल (2.6) दो संदेश कतारों को लागू करता है:
(बल्कि 'संदेश सूचियाँ', जैसा कि कार्यान्वयन एक लिंक की गई सूची का उपयोग करके किया जाता है, FIFO सिद्धांत का कड़ाई से पालन नहीं करता है)

सिस्टम V IPC संदेश

सिस्टम V से संदेश कतार।

msgsnd()संदेश भेजने के लिए एक प्रक्रिया शुरू हो सकती है । उसे प्राप्त संदेश कतार, संदेश का आकार और संदेश संरचना, संदेश प्रकार और पाठ सहित आईपीसी पहचानकर्ता को पास करना होगा।

दूसरी तरफ, एक प्रक्रिया msgrcv()एक संदेश प्राप्त करने के लिए आमंत्रित करती है, संदेश कतार के आईपीसी पहचानकर्ता को पास करती है, जहां संदेश संग्रहीत किया जाना चाहिए, आकार और एक मूल्य टी

t कतार से लौटाए गए संदेश को निर्दिष्ट करता है, एक सकारात्मक मान का अर्थ है कि t के बराबर अपने प्रकार के साथ पहला संदेश लौटाया जाता है, एक ऋणात्मक मान टाइप t के समान अंतिम संदेश देता है और शून्य कतार का पहला संदेश लौटाता है।

उन कार्यों को शामिल / linux / msg.h में परिभाषित किया गया है और ipc / msg.c में कार्यान्वित किया गया है

संदेश के आकार (अधिकतम), संदेश की कुल संख्या (mni) और कतार में सभी संदेशों के कुल आकार (mnb) पर सीमाएँ हैं:

$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 8192
kernel.msgmni = 1655
kernel.msgmnb = 16384

ऊपर का आउटपुट उबंटू 10.10 सिस्टम से है, डिफॉल्ट्स msg.h में परिभाषित किए गए हैं

अधिक अविश्वसनीय रूप से पुरानी प्रणाली वी संदेश कतार सामान यहां समझाया गया है

POSIX संदेश कतार

POSIX मानक सिस्टम V IPC की संदेश कतार के आधार पर एक संदेश कतार तंत्र को परिभाषित करता है, इसे कुछ कार्यात्मकताओं द्वारा विस्तारित करता है:

  • अनुप्रयोग के लिए सरल फ़ाइल-आधारित इंटरफ़ेस
  • संदेश की प्राथमिकताओं के लिए समर्थन
  • अतुल्यकालिक अधिसूचना के लिए समर्थन
  • संचालन अवरुद्ध करने के लिए समय समाप्त

Ipc / mqueue.c देखें

उदाहरण

util-linux संदेश कतारों के विश्लेषण और संशोधन के लिए कुछ कार्यक्रम प्रदान करता है और POSIX विनिर्देश कुछ C उदाहरण देता है:

के साथ एक संदेश कतार बनाएँ ipcmk; आम तौर पर आप ऐसा सी कार्यों को कॉल करके करेंगे ftok()और msgget():

$ ipcmk -Q

आइए देखें कि क्या उपयोग करके ipcsया उसके साथ क्या हुआ cat /proc/sysvipc/msg:

$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

अब कुछ संदेशों के साथ कतार भरें:

$ cat <<EOF >msg_send.c
#include <string.h>
#include <sys/msg.h> 

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;

  msg.type = 1;
  strcpy(msg.text, "This is message 1");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);
  strcpy(msg.text, "This is message 2");
  msgsnd(msqid, (void *) &msg, sizeof(msg.text), IPC_NOWAIT);

  return 0;
}
EOF

फिर, आप आमतौर पर कोड में msqid को हार्डकोड नहीं करते हैं।

$ gcc -o msg_send msg_send.c
$ ./msg_send
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        40           2        

और दूसरा पक्ष, जो संदेश प्राप्त कर रहा होगा:

$ cat <<EOF >msg_recv.c
#include <stdio.h>
#include <sys/msg.h>

int main() {
  int msqid = 65536;
  struct message {
    long type;
    char text[20];
  } msg;
  long msgtyp = 0;

  msgrcv(msqid, (void *) &msg, sizeof(msg.text), msgtyp, MSG_NOERROR | IPC_NOWAIT);
  printf("%s \n", msg.text);

  return 0;
}
EOF

देखते हैं क्या होता है:

$ gcc -o msg_recv msg_recv.c
$ ./msg_recv
This is message 1
$ ./msg_recv
This is message 2
$ ipcs -q

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages    
0x33ec1686 65536      user       644        0            0           

दो प्राप्त होने के बाद, कतार फिर से खाली है।

कुंजी ( -Q) या msqid ( -q) निर्दिष्ट करके इसे बाद में निकालें :

$ ipcrm -q 65536

तो क्या संदेश (प्रकार और पाठ) को क्लोन / कॉपी किया जाता है और फिर उस प्रतिलिपि को सिस्टम की संदेश कतार में डाल दिया जाता है?
त्रिशूत्र

बहुत अच्छी तरह से डाल दिया। इस अद्भुत स्पष्टीकरण के लिए धन्यवाद।
User9102d82 15
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.