লিনাক্স কার্নেলের মধ্যে একটি বার্তা সারি কীভাবে প্রয়োগ করা হয়?


29

আমি জানতে চাইছি যে লিনাক্স কার্নেলে কীভাবে বার্তা সারিগুলি প্রয়োগ করা হয়।


আইপিসি_নাউইট আমরা এটি কেবলমাত্র গ্রহীতার ক্ষেত্রে ব্যবহার করি
আনোয়ার কাঃ

উত্তর:


41

লিনাক্স কার্নেল (২.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

সুতরাং বার্তাটি (প্রকার এবং পাঠ্য) কি ক্লোন / অনুলিপি হয়ে যায় এবং তারপরে সেই অনুলিপিটি সিস্টেমের বার্তার কাতারে পড়ে যায়?
trusktr

খুব সুন্দরভাবে বলা। এই বিস্ময়কর ব্যাখ্যার জন্য আপনাকে ধন্যবাদ।
ব্যবহারকারী 9102d82
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.