এই পৃষ্ঠায়, আপনি স্যান্ডবক্সড এপিআই (SAPI) ব্যবহার করে কীভাবে আপনার নিজস্ব স্যান্ডবক্সড C/C++ লাইব্রেরি তৈরি করবেন তা শিখবেন। হেডার ফাইলগুলিতে থাকা উদাহরণ এবং কোড ডকুমেন্টেশনের পাশাপাশি এটিকে একটি নির্দেশিকা হিসাবে ব্যবহার করুন।
বিল্ড নির্ভরতা
সিস্টেমে নিম্নলিখিত নির্ভরতাগুলি অবশ্যই ইনস্টল করা থাকতে হবে:
- UTS, IPC, ব্যবহারকারী, PID, এবং নেটওয়ার্ক নেমস্পেস সমর্থন সহ লিনাক্স কার্নেল
- লিনাক্স ব্যবহারকারী-স্পেস এপিআই হেডার
- আপনার কোড কম্পাইল করতে: GCC 6 (ভার্সন 7 বা তার উচ্চতর সংস্করণ কাম্য) অথবা Clang 7 (বা উচ্চতর সংস্করণ)
- স্বয়ংক্রিয়ভাবে হেডার ফাইল তৈরি করার জন্য: Clang Python Bindings
- পাইথন ৩.৫ বা তার পরবর্তী সংস্করণ
- Bazel ভার্সন ২.২.০ অথবা CMake ভার্সন ৩.১২ বা তার চেয়ে উচ্চতর।
বেজেল ব্যবহার করে
বেজেল হলো প্রস্তাবিত বিল্ড সিস্টেম এবং এর সাথে ইন্টিগ্রেট করা সবচেয়ে সহজ।
আমাদের ডকুমেন্টেশনে Clang কম্পাইলার ব্যবহার করা হয়েছে। আপনার যদি কোনো নির্দিষ্ট টুলচেইনের (যেমন কম্পাইলার, লিঙ্কার, ইত্যাদি) প্রয়োজন হয়, তাহলে ডিফল্ট কম্পাইলার টুলচেইন কীভাবে পরিবর্তন করতে হয়, সে সম্পর্কে তথ্যের জন্য Bazel ডকুমেন্টেশন দেখুন।
ডেবিয়ান ১০ (বাস্টার)
বিল্ড নির্ভরতা ইনস্টল করতে:
echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | \ sudo tee /etc/apt/sources.list.d/bazel.listwget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -sudo apt-get updatesudo apt-get install -qy build-essential linux-libc-dev bazel python3 \ python3-pip libclang-devpip3 install clang
জেন্টু
প্রয়োজনীয় কার্নেল বিকল্পসমূহ:
General setup --->
-*- Namespaces support
[*] UTS namespace
[*] IPC namespace
[*] User namespace (EXPERIMENTAL)
[*] PID Namespaces
[*] Network namespace
বিল্ড নির্ভরতা ইনস্টল করতে:
emerge dev-util/bazel dev-python/typing dev-python/clang-pythonCMake ব্যবহার করে
CMake একটি জনপ্রিয় ওপেন-সোর্স মেটা বিল্ড সিস্টেম যা Ninja বা Make-এর মতো বিল্ড টুলগুলোর জন্য প্রোজেক্ট ফাইল তৈরি করে।
ডেবিয়ান ১০ (বাস্টার)
বিল্ড নির্ভরতা ইনস্টল করতে:
sudo apt-get install -qy build-essential linux-libc-dev cmake ninja-build \ python3 python3-pip libclang-dev libcap-devpip3 install absl-py clang
জেন্টু
প্রয়োজনীয় কার্নেল বিকল্পসমূহ:
General setup --->
-*- Namespaces support
[*] UTS namespace
[*] IPC namespace
[*] User namespace (EXPERIMENTAL)
[*] PID Namespaces
[*] Network namespace
বিল্ড নির্ভরতা ইনস্টল করতে:
emerge sys-kernel/linux-headers dev-util/cmake dev-util/ninja \
dev-python/clang-pythonউন্নয়ন প্রক্রিয়া
একটি C/C++ লাইব্রেরিকে স্যান্ডবক্স করার জন্য, আপনাকে আপনার প্রোজেক্টের জন্য দুটি জিনিস প্রস্তুত করতে হবে:
- স্যান্ডবক্সড লাইব্রেরি
- হোস্ট কোড যা আপনার স্যান্ডবক্সড লাইব্রেরি দ্বারা উন্মুক্ত কার্যকারিতা ব্যবহার করবে। SAPI বিল্ড প্রক্রিয়ার সময় স্বয়ংক্রিয়ভাবে আপনার জন্য SAPI অবজেক্ট এবং RPC স্টাব তৈরি করবে।
স্যান্ডবক্স২-এর উদাহরণগুলো থেকে আপনি হয়তো zlib-এর সাথে পরিচিত, যেখানে একটি সম্পূর্ণ প্রোগ্রাম ( zpipe.c ) স্যান্ডবক্স করা হয়েছিল। নিম্নলিখিত ধাপগুলোতে, আপনি শিখবেন কীভাবে SAPI ব্যবহার করে zlib লাইব্রেরিকে স্যান্ডবক্স করতে হয় এবং সেই স্যান্ডবক্স করা লাইব্রেরিটি কাজে লাগাতে হয়।
১. কোন ফাংশনগুলো প্রয়োজন তা নির্ধারণ করুন
আপনি যদি zlib হোস্ট কোড ( main_zlib.cc ) দেখেন, তাহলে দেখতে পাবেন যে টুলটির কাজ হলো stdin থেকে ডেটা পড়া এবং একটি EOF মার্কার না পাওয়া পর্যন্ত zlib-এর deflate() ফাংশন ব্যবহার করে ডেটা সংকুচিত করা। সব মিলিয়ে, প্রোগ্রামটি zlib-এর তিনটি ফাংশন ব্যবহার করে:
-
deflateInit_(): কম্প্রেশনের জন্য প্রারম্ভিকীকরণ করতে -
deflate(): ডেটা চাঙ্কের উপর কম্প্রেশন অপারেশন সম্পাদন করার জন্য। -
deflateEnd(): কম্প্রেশন শেষ করতে এবং ডায়নামিকভাবে বরাদ্দ করা ডেটা স্ট্রাকচারগুলি মুক্ত করতে।
বাস্তব জীবনের একটি উদাহরণে, আপনি C/C++ লাইব্রেরিটি পর্যালোচনা করবেন এবং কোন ফাংশনগুলো প্রয়োজন তা স্থির করবেন। একটি সম্ভাব্য কৌশল হলো হোস্ট কোড দিয়ে শুরু করা এবং লাইব্রেরিটি আনস্যান্ডবক্সড অবস্থায় ব্যবহার করা। তারপর, দ্বিতীয় ধাপে, আপনি স্যান্ডবক্সড লাইব্রেরিটি জেনারেট করতে পারেন এবং স্যান্ডবক্সড ফাংশন কলগুলো ব্যবহার করার জন্য হোস্ট কোডটিকে অভিযোজিত করতে পারেন।
২. sapi_library-এর বিল্ড রুলটি লিখুন।
স্যান্ডবক্সড zlib লাইব্রেরি থেকে প্রয়োজনীয় তিনটি zlib ফাংশন শনাক্ত করার পর, আপনি BUILD ফাইলে বিল্ড রুলটি নির্ধারণ করতে পারেন। sapi_library বিল্ড রুলের ডকুমেন্টেশন Build Rules পেজে পাওয়া যাবে।
নিচের কোড স্নিপেটটি zlib SAPI উদাহরণের জন্য sapi_library সংজ্ঞা দেখাচ্ছে। lib অ্যাট্রিবিউট ব্যবহার করে, Bazel-কে WORKSPACE ফাইলে zlib লাইব্রেরিটি খুঁজতে নির্দেশ দেওয়া হয়েছে।
sapi_library(
name = "zlib-sapi",
srcs = [],
hdrs = [],
functions = [
"deflateInit_",
"deflate",
"deflateEnd",
],
lib = "@net_zlib//:zlib",
lib_name = "Zlib",
namespace = "sapi::zlib",
)
এর ফলে স্যান্ডবক্সড zlib লাইব্রেরিটি তৈরি হয়। আউটপুটটি হলো SAPI অবজেক্ট, যা হোস্ট কোডে অন্তর্ভুক্ত করা যায় এবং RPC কলের মাধ্যমে স্যান্ডবক্সড লাইব্রেরির সাথে যোগাযোগের জন্য ব্যবহার করা যায়। এই উদাহরণে ব্যবহৃত স্যান্ডবক্স পলিসিটি হলো ডিফল্ট পলিসি।
৩. হোস্ট কোড লিখুন বা পরিবর্তন করুন
এখন তৈরি করা SAPI লাইব্রেরিটি হোস্ট কোডে অন্তর্ভুক্ত করার সময় এসেছে।
স্যান্ডবক্স তৈরি করুন
একটি স্যান্ডবক্স অবজেক্ট তৈরি করতে sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create()); ব্যবহার করুন।
SAPI অবজেক্টটি ইনস্ট্যানশিয়েট করতে এবং এর মাধ্যমে স্যান্ডবক্সড ফাংশনগুলোকে ব্যবহারের জন্য উপলব্ধ করতে sapi::zlib::ZlibApi api(&sandbox); ব্যবহার করুন।
SAPI প্রকার ব্যবহার করুন
SAPI টাইপ হলো C++ ক্লাসের আকারে এক বিশেষ ধরনের টাইপ, যা SAPI সরবরাহ করে কারণ কখনও কখনও সাধারণ C-টাইপ কাজ করে না।
SAPI টাইপের প্রথম ব্যবহার strm এর ডিক্লারেশনে দেখা যায়, যেখানে একটি SAPI Struct ব্যবহৃত হয়েছে: sapi::v::Struct<sapi::zlib::z_stream> strm;
টেমপ্লেট টাইপ ( sapi::zlib::z_stream ) হলো বিল্ড রুল দ্বারা স্বয়ংক্রিয়ভাবে তৈরি কোডের একটি ভালো উদাহরণ।
আরও বিস্তারিত জানতে ভেরিয়েবল পৃষ্ঠাটি দেখুন।
এপিআই কল করুন
defalteInit_ , deflate , বা deflateEnd কে কল করতে SAPI অবজেক্ট ব্যবহার করুন। যদি আপনি 'change' পদ্ধতিটি ব্যবহার করার সিদ্ধান্ত নেন, তাহলে আপনাকে নিশ্চিত করতে হবে যে ফাংশন প্যারামিটারগুলো প্রত্যাশিত মানের সাথে মেলে।
zlib উদাহরণে প্রতিটি কলের একটি উদাহরণ :
api.deflateInit_(strm.PtrBoth(), Z_DEFAULT_COMPRESSION, version.PtrBefore(), sizeof(sapi::zlib::z_stream));
api.deflate(strm.PtrBoth(), flush);
api.deflateEnd(strm.PtrBoth()).IgnoreError();
SAPI লেনদেন ব্যবহার করে
SAPI হোস্ট কোডকে স্যান্ডবক্সড লাইব্রেরি থেকে আলাদা করে এবং কলারকে সমস্যাযুক্ত ডেটা প্রসেসিং অনুরোধগুলি পুনরায় শুরু বা বাতিল করার ক্ষমতা দেয়। SAPI ট্রানজ্যাকশন আরও এক ধাপ এগিয়ে যায় এবং ব্যর্থ প্রক্রিয়াগুলিকে স্বয়ংক্রিয়ভাবে পুনরাবৃত্তি করে।
আরও বিস্তারিত তথ্যের জন্য SAPI লেনদেন পৃষ্ঠাটি দেখুন।
উদাহরণ
Examples-এর অধীনে আপনি SAPI টিম কর্তৃক ইতোমধ্যে প্রস্তুতকৃত কয়েকটি লাইব্রেরি খুঁজে পাবেন।