shmget(), shmat(), shmdt(), এবং shmctl() হল UNIX/Linux সিস্টেমে শেয়ার্ড মেমরি (Shared Memory) পরিচালনার জন্য ব্যবহৃত সিস্টেম কল। শেয়ার্ড মেমরি একটি IPC (Inter-Process Communication) পদ্ধতি যা বিভিন্ন প্রক্রিয়ার মধ্যে ডেটা ভাগ করে নেওয়ার অনুমতি দেয়। চলুন এই সিস্টেম কলগুলোর ব্যবহার এবং কার্যকারিতা নিয়ে আলোচনা করি:
1. shmget()
সংজ্ঞা:
shmget() ফাংশনটি একটি নতুন শেয়ার্ড মেমরি সেগমেন্ট তৈরি করে অথবা একটি বিদ্যমান সেগমেন্টের জন্য একটি শনাক্তকারী (identifier) প্রদান করে।
সাইনাটর:
int shmget(key_t key, size_t size, int shmflg);
- key: শেয়ার্ড মেমরি সেগমেন্টের জন্য একটি ইউনিক কী।
- size: সেগমেন্টের আকার (বাইটে)।
- shmflg: কিছু ফ্ল্যাগ, যেমন
IPC_CREAT(যদি সেগমেন্টটি না থাকে তবে তৈরি করা হবে)।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/shm.h>
key_t key = 1234; // সেগমেন্টের জন্য একটি কী
int shmid = shmget(key, 1024, IPC_CREAT | 0666); // 1024 বাইটের সেগমেন্ট তৈরি
2. shmat()
সংজ্ঞা:
shmat() ফাংশনটি একটি শেয়ার্ড মেমরি সেগমেন্টকে প্রক্রিয়ার মেমরি স্পেসে যুক্ত করে।
সাইনাটর:
void* shmat(int shmid, const void* shmaddr, int shmflg);
- shmid:
shmget()দ্বারা প্রাপ্ত শনাক্তকারী। - shmaddr: কোন ঠিকানায় শেয়ার্ড মেমরি যুক্ত হবে (সাধারণত
NULLদেওয়া হয়)। - shmflg: ফ্ল্যাগ, যেমন
SHM_RDONLY(শুধু পড়ার জন্য)।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
int shmid = shmget(key, 1024, 0666); // পূর্বে তৈরি শেয়ার্ড মেমরি শনাক্তকারী
char *str = (char*) shmat(shmid, NULL, 0); // শেয়ার্ড মেমরি যুক্ত করা
3. shmdt()
সংজ্ঞা:
shmdt() ফাংশনটি একটি শেয়ার্ড মেমরি সেগমেন্টকে প্রক্রিয়ার মেমরি স্পেস থেকে বিচ্ছিন্ন করে।
সাইনাটর:
int shmdt(const void* shmaddr);
- shmaddr: শেয়ার্ড মেমরি সেগমেন্টের ঠিকানা, যা
shmat()দ্বারা প্রাপ্ত হয়।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/shm.h>
shmdt(str); // শেয়ার্ড মেমরি বিচ্ছিন্ন করা
4. shmctl()
সংজ্ঞা:
shmctl() ফাংশনটি শেয়ার্ড মেমরি সেগমেন্টের জন্য বিভিন্ন নিয়ন্ত্রণ অপারেশন সম্পাদন করে।
সাইনাটর:
int shmctl(int shmid, int cmd, struct shmid_ds* buf);
- shmid:
shmget()দ্বারা প্রাপ্ত শনাক্তকারী। - cmd: অপারেশন নির্দেশ করে, যেমন
IPC_RMID(মেমরি সেগমেন্ট মুছে ফেলা)। - buf: শেয়ার্ড মেমরি সম্পর্কে তথ্য সংগ্রহ করতে ব্যবহৃত হয় (সাধারণত
NULLহতে পারে)।
উদাহরণ:
#include <sys/ipc.h>
#include <sys/shm.h>
shmctl(shmid, IPC_RMID, NULL); // শেয়ার্ড মেমরি সেগমেন্ট মুছে ফেলা
উদাহরণ কোড
নিচে একটি সম্পূর্ণ উদাহরণ দেওয়া হল যা শেয়ার্ড মেমরি তৈরি, পড়া, লেখা এবং মুছে ফেলার প্রক্রিয়া দেখায়:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <unistd.h>
int main() {
key_t key = 1234; // শেয়ার্ড মেমরির কী
int shmid = shmget(key, 1024, IPC_CREAT | 0666); // শেয়ার্ড মেমরি তৈরি
char *str = (char*) shmat(shmid, NULL, 0); // শেয়ার্ড মেমরি যুক্ত করা
// লেখার জন্য
printf("Write Data: ");
fgets(str, 1024, stdin); // ইউজার ইনপুট নেওয়া
// পড়ার জন্য
printf("Data read from memory: %s\n", str);
// মেমরি বিচ্ছিন্ন করা
shmdt(str);
// শেয়ার্ড মেমরি সেগমেন্ট মুছে ফেলা
shmctl(shmid, IPC_RMID, NULL);
return 0;
}
উপসংহার
shmget(), shmat(), shmdt(), এবং shmctl() ফাংশনগুলি UNIX/Linux সিস্টেমে শেয়ার্ড মেমরি ব্যবস্থাপনার জন্য অত্যন্ত গুরুত্বপূর্ণ। এগুলি বিভিন্ন প্রক্রিয়ার মধ্যে ডেটা ভাগ করে নেওয়ার জন্য একটি কার্যকরী পদ্ধতি সরবরাহ করে, যা সিস্টেমের কার্যকারিতা বৃদ্ধি করে এবং যোগাযোগের সক্ষমতা বাড়ায়।
Read more