স্যান্ডবক্সড এপিআই দিয়ে শুরু করা, স্যান্ডবক্সড এপিআই দিয়ে শুরু করা

এই পৃষ্ঠায়, আপনি শিখবেন কিভাবে স্যান্ডবক্সড API (SAPI) দিয়ে আপনার নিজস্ব স্যান্ডবক্সড C/C++ লাইব্রেরি তৈরি করবেন। হেডার ফাইলে উদাহরণ এবং কোড ডকুমেন্টেশনের পাশাপাশি এটি একটি গাইড হিসাবে ব্যবহার করুন।

নির্ভরতা তৈরি করুন

নিম্নলিখিত নির্ভরতা সিস্টেমে ইনস্টল করা আবশ্যক:

  • ইউটিএস, আইপিসি, ব্যবহারকারী, পিআইডি এবং নেটওয়ার্ক নেমস্পেসের জন্য সমর্থন সহ লিনাক্স কার্নেল
  • লিনাক্স ইউজারস্পেস এপিআই হেডার
  • আপনার কোড কম্পাইল করতে: GCC 6 (সংস্করণ 7 বা উচ্চতর পছন্দের) বা ক্ল্যাং 7 (বা উচ্চতর)
  • স্বয়ংক্রিয়ভাবে তৈরি শিরোনাম ফাইলের জন্য: ক্ল্যাং পাইথন বাইন্ডিং
  • Python 3.5 বা তার পরে
  • Bazel সংস্করণ 2.2.0 বা CMake সংস্করণ 3.12 বা উচ্চতর।
    • শুধুমাত্র CMake: GNU Make বা libcap লাইব্রেরি হেডারের একটি সংস্করণ এবং একটি বিল্ড টুল যেমন নিনজা (প্রস্তাবিত)।

Bazel ব্যবহার করে

Bazel হল প্রস্তাবিত বিল্ড সিস্টেম এবং এর সাথে একীভূত করা সবচেয়ে সহজ।

আমাদের ডকুমেন্টেশন ক্ল্যাং কম্পাইলার ব্যবহার করে। আপনার যদি একটি নির্দিষ্ট টুলচেনের প্রয়োজন হয় (যেমন কম্পাইলার, লিঙ্কার, ইত্যাদি), ডিফল্ট কম্পাইলার টুলচেন কীভাবে পরিবর্তন করতে হয় সে সম্পর্কে তথ্যের জন্য Bazel ডকুমেন্টেশন দেখুন।

ডেবিয়ান 10 (বাস্টার)

বিল্ড নির্ভরতা ইনস্টল করতে:

echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | \
  sudo tee /etc/apt/sources.list.d/bazel.list
wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -qy build-essential linux-libc-dev bazel python3 \
  python3-pip libclang-dev
pip3 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-python

CMake ব্যবহার করে

CMake হল একটি জনপ্রিয় ওপেন-সোর্স মেটা বিল্ড সিস্টেম যা Ninja বা Make- এর মতো বিল্ড টুলের জন্য প্রোজেক্ট ফাইল তৈরি করে।

ডেবিয়ান 10 (বাস্টার)

বিল্ড নির্ভরতা ইনস্টল করতে:

sudo apt-get install -qy build-essential linux-libc-dev cmake ninja-build \
  python3 python3-pip libclang-dev libcap-dev
pip3 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++ লাইব্রেরি স্যান্ডবক্স করতে, আপনাকে আপনার প্রকল্পের জন্য দুটি আইটেম প্রস্তুত করতে হবে:

আপনি স্যান্ডবক্স2 উদাহরণ থেকে zlib এর সাথে পরিচিত হতে পারেন এখানে একটি সম্পূর্ণ প্রোগ্রাম ( zpipe.c ) স্যান্ডবক্স করা হয়েছিল। নিম্নলিখিত ধাপে, আপনি zlib লাইব্রেরি স্যান্ডবক্স করতে এবং স্যান্ডবক্সড লাইব্রেরি ব্যবহার করতে SAPI কীভাবে ব্যবহার করবেন তা শিখবেন।

1. কোন ফাংশন প্রয়োজন তা নির্ধারণ করুন

আপনি যদি zlib হোস্ট কোডটি দেখেন ( main_zlib.cc ), আপনি দেখতে পাবেন যে টুলটির কার্যকারিতা হল stdin থেকে ডেটা পড়া এবং zlib এর deflate() ফাংশন ব্যবহার করে ডেটা সংকুচিত করা যতক্ষণ না একটি EOF মার্কার পড়া হয়। মোট, প্রোগ্রামটি zlib থেকে তিনটি ফাংশন ব্যবহার করে:

  • deflateInit_() : কম্প্রেশনের জন্য আরম্ভ করতে
  • deflate() : ডেটা খণ্ডে কম্প্রেশন অপারেশন সম্পাদন করতে
  • deflateEnd() : কম্প্রেশন শেষ করতে এবং বিনামূল্যে গতিশীলভাবে বরাদ্দ করা ডেটা স্ট্রাকচার

একটি বাস্তব জীবনের উদাহরণে আপনি C/C++ লাইব্রেরি পর্যালোচনা করবেন এবং সিদ্ধান্ত নেবেন কোন ফাংশনগুলি প্রয়োজন। একটি সম্ভাব্য কৌশল হল হোস্ট কোড দিয়ে শুরু করা এবং লাইব্রেরিটি স্যান্ডবক্স ছাড়া ব্যবহার করা। তারপরে, দ্বিতীয় ধাপে, আপনি স্যান্ডবক্সড লাইব্রেরি তৈরি করতে পারেন এবং স্যান্ডবক্সড ফাংশন কলগুলি ব্যবহার করার জন্য হোস্ট কোডকে মানিয়ে নিতে পারেন।

2. sapi_library Build Rule লিখুন

স্যান্ডবক্সযুক্ত zlib লাইব্রেরি থেকে প্রয়োজনীয় তিনটি zlib ফাংশন সনাক্ত করার পরে, আপনি BUILD ফাইলে বিল্ড নিয়মটি সংজ্ঞায়িত করতে পারেন। sapi_library বিল্ড নিয়মের ডকুমেন্টেশন বিল্ড রুলস পেজে পাওয়া যাবে।

নীচের কোড স্নিপেট zlib SAPI উদাহরণের জন্য sapi_library সংজ্ঞা দেখায়। lib অ্যাট্রিবিউট ব্যবহার করে, Bazel কে zlib লাইব্রেরির জন্য WORKSPACE ফাইলটি দেখতে নির্দেশ দেওয়া হয়েছে।

sapi_library(
    name = "zlib-sapi",
    srcs = [],
    hdrs = [],
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@net_zlib//:zlib",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)

ফলাফল হল যে স্যান্ডবক্সযুক্ত zlib লাইব্রেরি তৈরি হয়। আউটপুট হল SAPI অবজেক্ট যা হোস্ট কোডে অন্তর্ভুক্ত করা যেতে পারে এবং RPC কলের মাধ্যমে স্যান্ডবক্সড লাইব্রেরির সাথে যোগাযোগ করতে ব্যবহার করা যেতে পারে। এই উদাহরণে ব্যবহৃত স্যান্ডবক্স নীতি হল ডিফল্ট নীতি৷

3. হোস্ট কোড লিখুন বা পরিবর্তন করুন

হোস্ট কোডে জেনারেট করা SAPI লাইব্রেরি অন্তর্ভুক্ত করার এখন সময়।

স্যান্ডবক্স তৈরি করুন

sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create()); একটি স্যান্ডবক্স বস্তু তৈরি করতে।

sapi::zlib::ZlibApi api(&sandbox); SAPI অবজেক্টকে ইনস্ট্যান্টিয়েট করতে এবং এইভাবে স্যান্ডবক্সড ফাংশনগুলিকে ব্যবহারের জন্য উপলব্ধ করতে।

SAPI প্রকারগুলি ব্যবহার করুন৷

SAPI প্রকারগুলি হল C++ ক্লাসের আকারে বিশেষ ধরনের যা SAPI প্রদান করে কারণ কখনও কখনও নিয়মিত C-টাইপগুলি কাজ করে না।

একটি SAPI প্রকারের প্রথম ব্যবহার strm এর ঘোষণায় লক্ষ্য করা যায়, যেখানে একটি SAPI স্ট্রাকট ব্যবহার করা হয়: sapi::v::Struct<sapi::zlib::z_stream> strm;

টেমপ্লেট টাইপ ( sapi::zlib::z_stream ) হল বিল্ড নিয়ম দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হওয়া কোডের একটি ভাল উদাহরণ।

আরও বিস্তারিত জানার জন্য ভেরিয়েবল পৃষ্ঠাটি দেখুন।

API কল করুন

defalteInit_ , deflate বা deflateEnd এ কল করতে, SAPI অবজেক্ট ব্যবহার করুন। আপনি যদি 'পরিবর্তন' পদ্ধতি ব্যবহার করার সিদ্ধান্ত নেন তবে আপনাকে নিশ্চিত করতে হবে যে ফাংশন প্যারামিটারগুলি প্রত্যাশিত মানগুলির সাথে মেলে।

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 লেনদেন পৃষ্ঠাটি দেখুন।

উদাহরণ

উদাহরণগুলির অধীনে আপনি কয়েকটি লাইব্রেরি খুঁজে পেতে পারেন, যা ইতিমধ্যে SAPI টিম দ্বারা প্রস্তুত করা হয়েছে।

,

এই পৃষ্ঠায়, আপনি শিখবেন কিভাবে স্যান্ডবক্সড API (SAPI) দিয়ে আপনার নিজস্ব স্যান্ডবক্সড C/C++ লাইব্রেরি তৈরি করবেন। হেডার ফাইলে উদাহরণ এবং কোড ডকুমেন্টেশনের পাশাপাশি এটি একটি গাইড হিসাবে ব্যবহার করুন।

নির্ভরতা তৈরি করুন

নিম্নলিখিত নির্ভরতা সিস্টেমে ইনস্টল করা আবশ্যক:

  • ইউটিএস, আইপিসি, ব্যবহারকারী, পিআইডি এবং নেটওয়ার্ক নেমস্পেসের জন্য সমর্থন সহ লিনাক্স কার্নেল
  • লিনাক্স ইউজারস্পেস এপিআই হেডার
  • আপনার কোড কম্পাইল করতে: GCC 6 (সংস্করণ 7 বা উচ্চতর পছন্দের) বা ক্ল্যাং 7 (বা উচ্চতর)
  • স্বয়ংক্রিয়ভাবে তৈরি শিরোনাম ফাইলের জন্য: ক্ল্যাং পাইথন বাইন্ডিং
  • Python 3.5 বা তার পরে
  • Bazel সংস্করণ 2.2.0 বা CMake সংস্করণ 3.12 বা উচ্চতর।
    • শুধুমাত্র CMake: GNU Make বা libcap লাইব্রেরি হেডারের একটি সংস্করণ এবং একটি বিল্ড টুল যেমন নিনজা (প্রস্তাবিত)।

Bazel ব্যবহার করে

Bazel হল প্রস্তাবিত বিল্ড সিস্টেম এবং এর সাথে একীভূত করা সবচেয়ে সহজ।

আমাদের ডকুমেন্টেশন ক্ল্যাং কম্পাইলার ব্যবহার করে। আপনার যদি একটি নির্দিষ্ট টুলচেনের প্রয়োজন হয় (যেমন কম্পাইলার, লিঙ্কার, ইত্যাদি), ডিফল্ট কম্পাইলার টুলচেন কীভাবে পরিবর্তন করতে হয় সে সম্পর্কে তথ্যের জন্য Bazel ডকুমেন্টেশন দেখুন।

ডেবিয়ান 10 (বাস্টার)

বিল্ড নির্ভরতা ইনস্টল করতে:

echo "deb http://storage.googleapis.com/bazel-apt stable jdk1.8" | \
  sudo tee /etc/apt/sources.list.d/bazel.list
wget -qO - https://bazel.build/bazel-release.pub.gpg | sudo apt-key add -
sudo apt-get update
sudo apt-get install -qy build-essential linux-libc-dev bazel python3 \
  python3-pip libclang-dev
pip3 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-python

CMake ব্যবহার করে

CMake হল একটি জনপ্রিয় ওপেন-সোর্স মেটা বিল্ড সিস্টেম যা Ninja বা Make- এর মতো বিল্ড টুলের জন্য প্রোজেক্ট ফাইল তৈরি করে।

ডেবিয়ান 10 (বাস্টার)

বিল্ড নির্ভরতা ইনস্টল করতে:

sudo apt-get install -qy build-essential linux-libc-dev cmake ninja-build \
  python3 python3-pip libclang-dev libcap-dev
pip3 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++ লাইব্রেরি স্যান্ডবক্স করতে, আপনাকে আপনার প্রকল্পের জন্য দুটি আইটেম প্রস্তুত করতে হবে:

আপনি স্যান্ডবক্স2 উদাহরণ থেকে zlib এর সাথে পরিচিত হতে পারেন এখানে একটি সম্পূর্ণ প্রোগ্রাম ( zpipe.c ) স্যান্ডবক্স করা হয়েছিল। নিম্নলিখিত ধাপে, আপনি zlib লাইব্রেরি স্যান্ডবক্স করতে এবং স্যান্ডবক্সড লাইব্রেরি ব্যবহার করতে SAPI কীভাবে ব্যবহার করবেন তা শিখবেন।

1. কোন ফাংশন প্রয়োজন তা নির্ধারণ করুন

আপনি যদি zlib হোস্ট কোডটি দেখেন ( main_zlib.cc ), আপনি দেখতে পাবেন যে টুলটির কার্যকারিতা হল stdin থেকে ডেটা পড়া এবং zlib এর deflate() ফাংশন ব্যবহার করে ডেটা সংকুচিত করা যতক্ষণ না একটি EOF মার্কার পড়া হয়। মোট, প্রোগ্রামটি zlib থেকে তিনটি ফাংশন ব্যবহার করে:

  • deflateInit_() : কম্প্রেশনের জন্য আরম্ভ করতে
  • deflate() : ডেটা খণ্ডে কম্প্রেশন অপারেশন সম্পাদন করতে
  • deflateEnd() : কম্প্রেশন শেষ করতে এবং বিনামূল্যে গতিশীলভাবে বরাদ্দ করা ডেটা স্ট্রাকচার

একটি বাস্তব জীবনের উদাহরণে আপনি C/C++ লাইব্রেরি পর্যালোচনা করবেন এবং সিদ্ধান্ত নেবেন কোন ফাংশনগুলি প্রয়োজন। একটি সম্ভাব্য কৌশল হল হোস্ট কোড দিয়ে শুরু করা এবং লাইব্রেরিটি স্যান্ডবক্স ছাড়া ব্যবহার করা। তারপরে, দ্বিতীয় ধাপে, আপনি স্যান্ডবক্সড লাইব্রেরি তৈরি করতে পারেন এবং স্যান্ডবক্সড ফাংশন কলগুলি ব্যবহার করার জন্য হোস্ট কোডকে মানিয়ে নিতে পারেন।

2. sapi_library Build Rule লিখুন

স্যান্ডবক্সযুক্ত zlib লাইব্রেরি থেকে প্রয়োজনীয় তিনটি zlib ফাংশন সনাক্ত করার পরে, আপনি BUILD ফাইলে বিল্ড নিয়মটি সংজ্ঞায়িত করতে পারেন। sapi_library বিল্ড নিয়মের ডকুমেন্টেশন বিল্ড রুলস পেজে পাওয়া যাবে।

নীচের কোড স্নিপেট zlib SAPI উদাহরণের জন্য sapi_library সংজ্ঞা দেখায়। lib অ্যাট্রিবিউট ব্যবহার করে, Bazel কে zlib লাইব্রেরির জন্য WORKSPACE ফাইলটি দেখতে নির্দেশ দেওয়া হয়েছে।

sapi_library(
    name = "zlib-sapi",
    srcs = [],
    hdrs = [],
    functions = [
        "deflateInit_",
        "deflate",
        "deflateEnd",
    ],
    lib = "@net_zlib//:zlib",
    lib_name = "Zlib",
    namespace = "sapi::zlib",
)

ফলাফল হল যে স্যান্ডবক্সযুক্ত zlib লাইব্রেরি তৈরি হয়। আউটপুট হল SAPI অবজেক্ট যা হোস্ট কোডে অন্তর্ভুক্ত করা যেতে পারে এবং RPC কলের মাধ্যমে স্যান্ডবক্সড লাইব্রেরির সাথে যোগাযোগ করতে ব্যবহার করা যেতে পারে। এই উদাহরণে ব্যবহৃত স্যান্ডবক্স নীতি হল ডিফল্ট নীতি৷

3. হোস্ট কোড লিখুন বা পরিবর্তন করুন

হোস্ট কোডে জেনারেট করা SAPI লাইব্রেরি অন্তর্ভুক্ত করার এখন সময়।

স্যান্ডবক্স তৈরি করুন

sapi::Sandbox sandbox(sapi::zlib::zlib_sapi_embed_create()); একটি স্যান্ডবক্স বস্তু তৈরি করতে।

sapi::zlib::ZlibApi api(&sandbox); SAPI অবজেক্টকে ইনস্ট্যান্টিয়েট করতে এবং এইভাবে স্যান্ডবক্সড ফাংশনগুলিকে ব্যবহারের জন্য উপলব্ধ করতে।

SAPI প্রকারগুলি ব্যবহার করুন৷

SAPI প্রকারগুলি হল C++ ক্লাসের আকারে বিশেষ ধরনের যা SAPI প্রদান করে কারণ কখনও কখনও নিয়মিত C-টাইপগুলি কাজ করে না।

একটি SAPI প্রকারের প্রথম ব্যবহার strm এর ঘোষণায় লক্ষ্য করা যায়, যেখানে একটি SAPI স্ট্রাকট ব্যবহার করা হয়: sapi::v::Struct<sapi::zlib::z_stream> strm;

টেমপ্লেট টাইপ ( sapi::zlib::z_stream ) হল বিল্ড নিয়ম দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হওয়া কোডের একটি ভাল উদাহরণ।

আরও বিস্তারিত জানার জন্য ভেরিয়েবল পৃষ্ঠাটি দেখুন।

API কল করুন

defalteInit_ , deflate বা deflateEnd এ কল করতে, SAPI অবজেক্ট ব্যবহার করুন। আপনি যদি 'পরিবর্তন' পদ্ধতি ব্যবহার করার সিদ্ধান্ত নেন তবে আপনাকে নিশ্চিত করতে হবে যে ফাংশন প্যারামিটারগুলি প্রত্যাশিত মানগুলির সাথে মেলে।

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 লেনদেন পৃষ্ঠাটি দেখুন।

উদাহরণ

উদাহরণগুলির অধীনে আপনি কয়েকটি লাইব্রেরি খুঁজে পেতে পারেন, যা ইতিমধ্যে SAPI টিম দ্বারা প্রস্তুত করা হয়েছে।