উত্তর:
লিনাক্স কার্নেল (২.6) দুটি বার্তা সারি প্রয়োগ করে:
(পরিবর্তে 'বার্তা তালিকাগুলি', যেমন বাস্তবায়ন FIFO নীতিটি কঠোরভাবে অনুসরণ না করে লিঙ্কযুক্ত তালিকার সাহায্যে করা হয়)
সিস্টেম ভি আইপিসি বার্তা
সিস্টেম ভি এর বার্তার সারি।
একটি প্রক্রিয়া msgsnd()
একটি বার্তা প্রেরণ করতে পারেন । বার্তা প্রাপ্তির বার্তা সারি, বার্তার আকার এবং বার্তার কাঠামো সহ বার্তার প্রকার এবং পাঠ্য সহ তাকে আইপিসি সনাক্তকারী পাস করতে হবে।
অন্যদিকে, একটি প্রক্রিয়া msgrcv()
একটি বার্তা প্রাপ্তির জন্য আহ্বান জানায় , বার্তা কাতারের আইপিসি শনাক্তকারীকে পাস করে, যেখানে বার্তাটি সংরক্ষণ করা উচিত, আকার এবং মান টি ।
টি কিউ থেকে ফিরে আসা বার্তাটি নির্দিষ্ট করে, ধনাত্মক মান বলতে টি এর সমান টি দিয়ে প্রথম বার্তাটি ফিরে আসে, একটি নেতিবাচক মান টাইপ টি-এর সমান শেষ বার্তাটি প্রদান করে এবং শূন্যের সাথে সারির প্রথম বার্তা ফিরে আসে।
এই ফাংশনগুলি অন্তর্ভুক্ত / লিনাক্স / msg.h এ সংজ্ঞায়িত করা হয়েছে এবং আইপিসি / msg.c তে প্রয়োগ করা হয়েছে
একটি বার্তার আকার (সর্বাধিক), বার্তাগুলির মোট সংখ্যা (এমনি) এবং কাতারে সমস্ত বার্তার মোট আকার (এমএনবি) এর সীমাবদ্ধতা রয়েছে:
$ sysctl kernel.msg{max,mni,mnb}
kernel.msgmax = 8192
kernel.msgmni = 1655
kernel.msgmnb = 16384
উপরের আউটপুটটি একটি উবুন্টু ১০.১০ সিস্টেম থেকে এসেছে, ডিফল্টগুলি সংশ্লেষ করা হয় ।
আরও অবিশ্বাস্যরূপে পুরানো সিস্টেম ভি বার্তা কাতারের জিনিসগুলি এখানে ব্যাখ্যা করা হয়েছে ।
পজিক্স বার্তা সারি
পসিক্স স্ট্যান্ডার্ড সিস্টেম ভি আইপিসির বার্তার সারি ভিত্তিতে একটি বার্তা কাতারের ব্যবস্থাকে সংজ্ঞায়িত করে কিছু কার্যকারিতা দ্বারা এটি প্রসারিত করে:
দেখুন IPC / mqueue.c
উদাহরণ
util-linux
বার্তা সারি বিশ্লেষণ এবং সংশোধন করার জন্য কিছু প্রোগ্রাম সরবরাহ করে এবং পসিক্স স্পেসিফিকেশন কিছু সি উদাহরণ দেয়:
এর সাথে একটি বার্তার সারি তৈরি করুন 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
আবার, আপনি সাধারণত কোডটিতে এমএসকিডকে হার্ডকোড করেন না।
$ 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
) বা এমএসকিড ( -q
) নির্দিষ্ট করে এটি সরিয়ে ফেলুন :
$ ipcrm -q 65536