जवाबों:
लिनक्स कर्नेल (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