msgget(), msgsnd(), msgrcv(), এবং msgctl() ফাংশনগুলি UNIX/Linux সিস্টেমে মেসেজ কিউ (Message Queue) পরিচালনার জন্য ব্যবহৃত সিস্টেম কল। মেসেজ কিউ হল একটি আইপি (Inter-Process Communication) পদ্ধতি, যা প্রক্রিয়াগুলির মধ্যে তথ্য আদান-প্রদানের জন্য ব্যবহার করা হয়। আসুন এই ফাংশনগুলির ব্যবহার এবং কার্যকারিতা নিয়ে আলোচনা করি।
1. msgget()
সংজ্ঞা:
msgget() ফাংশনটি একটি নতুন মেসেজ কিউ তৈরি করে বা একটি বিদ্যমান কিউর জন্য শনাক্তকারী (identifier) প্রদান করে।
সাইনাটর:
int msgget(key_t key, int msgflg);
- key: মেসেজ কিউয়ের জন্য একটি ইউনিক কী।
- msgflg: কিছু ফ্ল্যাগ, যেমন
IPC_CREAT(যদি কিউটি না থাকে তবে তৈরি করবে)।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/msg.h>
key_t key = 1234; // মেসেজ কিউয়ের জন্য একটি কী
int msgid = msgget(key, IPC_CREAT | 0666); // নতুন মেসেজ কিউ তৈরি করা
2. msgsnd()
সংজ্ঞা:
msgsnd() ফাংশনটি একটি মেসেজ কিউতে নতুন মেসেজ পাঠানোর জন্য ব্যবহৃত হয়।
সাইনাটর:
int msgsnd(int msqid, const void *msgp, size_t msgsz, int msgflg);
- msqid:
msgget()দ্বারা প্রাপ্ত মেসেজ কিউয়ের শনাক্তকারী। - msgp: পাঠানোর জন্য মেসেজের পয়েন্টার।
- msgsz: মেসেজের আকার (বাইটে)।
- msgflg: ফ্ল্যাগ, যেমন
IPC_NOWAIT(যদি কিউ পূর্ণ হয় তবে অপেক্ষা না করা)।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
struct msgbuf {
long mtype; // মেসেজের টাইপ
char mtext[100]; // মেসেজের বিষয়বস্তু
};
struct msgbuf message;
message.mtype = 1; // মেসেজের টাইপ সেট করা
strcpy(message.mtext, "Hello, World!");
msgsnd(msgid, &message, sizeof(message.mtext), 0); // মেসেজ কিউতে মেসেজ পাঠানো
3. msgrcv()
সংজ্ঞা:
msgrcv() ফাংশনটি একটি মেসেজ কিউ থেকে মেসেজ গ্রহণ করার জন্য ব্যবহৃত হয়।
সাইনাটর:
int msgrcv(int msqid, void *msgp, size_t msgsz, long msgtyp, int msgflg);
- msqid:
msgget()দ্বারা প্রাপ্ত মেসেজ কিউয়ের শনাক্তকারী। - msgp: গ্রহণের জন্য মেসেজের পয়েন্টার।
- msgsz: মেসেজের সর্বাধিক আকার (বাইটে)।
- msgtyp: মেসেজের টাইপ (যদি 0 হয় তবে যেকোন মেসেজ গ্রহণ করবে)।
- msgflg: ফ্ল্যাগ, যেমন
IPC_NOWAIT(যদি কিউতে মেসেজ না থাকে তবে অপেক্ষা না করা)।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
struct msgbuf {
long mtype; // মেসেজের টাইপ
char mtext[100]; // মেসেজের বিষয়বস্তু
};
struct msgbuf message;
msgrcv(msgid, &message, sizeof(message.mtext), 1, 0); // মেসেজ গ্রহণ করা
printf("Received: %s\n", message.mtext); // মেসেজ প্রদর্শন
4. msgctl()
সংজ্ঞা:
msgctl() ফাংশনটি মেসেজ কিউয়ের জন্য বিভিন্ন নিয়ন্ত্রণ অপারেশন সম্পাদন করে।
সাইনাটর:
int msgctl(int msqid, int cmd, struct msqid_ds *buf);
- msqid:
msgget()দ্বারা প্রাপ্ত মেসেজ কিউয়ের শনাক্তকারী। - cmd: অপারেশন নির্দেশ করে, যেমন
IPC_RMID(মেসেজ কিউ মুছে ফেলা)। - buf: মেসেজ কিউ সম্পর্কে তথ্য সংগ্রহ করতে ব্যবহৃত হয় (সাধারণত
NULLহতে পারে)।
উদাহরণ:
msgctl(msgid, IPC_RMID, NULL); // মেসেজ কিউ মুছে ফেলা
সম্পূর্ণ উদাহরণ
নিচে একটি সম্পূর্ণ উদাহরণ দেওয়া হল যা মেসেজ কিউ তৈরি, মেসেজ পাঠানো, মেসেজ গ্রহণ এবং মেসেজ কিউ মুছে ফেলার প্রক্রিয়া দেখায়:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <unistd.h>
struct msgbuf {
long mtype; // মেসেজের টাইপ
char mtext[100]; // মেসেজের বিষয়বস্তু
};
int main() {
key_t key = 1234; // মেসেজ কিউয়ের জন্য কী
int msgid = msgget(key, IPC_CREAT | 0666); // মেসেজ কিউ তৈরি
// মেসেজ পাঠানো
struct msgbuf message;
message.mtype = 1; // মেসেজের টাইপ
strcpy(message.mtext, "Hello, World!");
msgsnd(msgid, &message, sizeof(message.mtext), 0); // মেসেজ পাঠানো
// মেসেজ গ্রহণ
struct msgbuf received_message;
msgrcv(msgid, &received_message, sizeof(received_message.mtext), 1, 0); // মেসেজ গ্রহণ
printf("Received: %s\n", received_message.mtext); // মেসেজ প্রদর্শন
// মেসেজ কিউ মুছে ফেলা
msgctl(msgid, IPC_RMID, NULL); // মেসেজ কিউ মুছে ফেলা
return 0;
}
উপসংহার
msgget(), msgsnd(), msgrcv(), এবং msgctl() ফাংশনগুলি UNIX/Linux সিস্টেমে মেসেজ কিউ পরিচালনার জন্য গুরুত্বপূর্ণ। এগুলি বিভিন্ন প্রক্রিয়ার মধ্যে তথ্য আদান-প্রদান নিশ্চিত করে, যা সিস্টেমের কার্যকারিতা এবং সহযোগিতা বাড়ায়। সঠিকভাবে এই ফাংশনগুলি ব্যবহার করে সফটওয়্যার সিস্টেমের যোগাযোগ দক্ষতা উন্নত করা সম্ভব।
Read more