ফাইল সিস্টেম নেভিগেট করার সময় ইউনিক্স কীভাবে কোনও ব্যবহারকারীর কার্যকরী ডিরেক্টরি ট্র্যাক করে?


29

বলুন আমি একটি ইউনিক্স সিস্টেমে শেলটিতে লগইন করি এবং কমান্ডগুলি ট্যাপ করা শুরু করি। আমি প্রথমে আমার ব্যবহারকারীর হোম ডিরেক্টরিতে শুরু করি ~। আমি সেখান থেকে cdনীচে ডিরেক্টরিতে যেতে পারি Documents

এখানে কাজ ডিরেক্টরিটি পরিবর্তন করার কমান্ডটি স্বজ্ঞাতভাবে বোঝার জন্য সহজ: প্যারেন্ট নোডে শিশু নোডগুলির একটি তালিকা রয়েছে যা এটি অ্যাক্সেস করতে পারে এবং সম্ভবত এটি একটি শিশু নোডের অস্তিত্ব সনাক্ত করতে অনুসন্ধানের একটি (অনুকূলিত) রূপ ব্যবহার করে ব্যবহারকারীর নাম লিখেছে, এবং কার্যকারী ডিরেক্টরিটি এটির সাথে মিলে যাওয়ার জন্য "পরিবর্তিত" হবে - আমি ভুল হয়ে থাকলে আমাকে সংশোধন করুন। এটি এমনকি সহজ হতে পারে যে শেলটি "সাদাসিধে" ব্যবহারকারীর ইচ্ছানুযায়ী ডিরেক্টরিটি অ্যাক্সেস করার চেষ্টা করে এবং যখন ফাইল সিস্টেমটি কিছু ধরণের ত্রুটি দেয়, শেলটি সেই অনুযায়ী একটি প্রতিক্রিয়া প্রদর্শন করে।

তবে আমি যে বিষয়ে আগ্রহী তা হ'ল আমি যখন কোনও ডিরেক্টরি নেভিগেট করি তখন একই প্রক্রিয়াটি কীভাবে কাজ করে, অর্থাত্ পিতামাতা বা পিতামাতার পিতামাতার কাছে।

আমার অজানা, সম্ভবত "অন্ধ" অবস্থানের স্থান দেওয়া Documents, সেই নাম সহ পুরো ফাইল সিস্টেম ট্রিতে সম্ভবত অনেকগুলি ডিরেক্টরিগুলির মধ্যে একটি, ইউনিক্স কীভাবে নির্ধারণ করবে যে আমাকে পরবর্তী কোথায় স্থাপন করা উচিত? এটি কি কোনও রেফারেন্স তৈরি করে তা pwdপরীক্ষা করে? যদি হ্যাঁ, pwdতবে বর্তমান ন্যাভিগেশনাল অবস্থাটি কীভাবে ট্র্যাক করবে?


1
আরও দেখুন সিম্বলিক লিঙ্ক পুনরাবৃত্তির - কি করে এটি "রিসেট"? যেখানে এর অনেক কিছুই ব্যাখ্যা করা আছে
স্টাফেন চেজেলাস

উত্তর:


76

অন্যান্য উত্তরগুলি হ'ল ওভারসিম্প্লিফিকেশন, প্রতিটি গল্পের কেবলমাত্র অংশ উপস্থাপন করে এবং কয়েকটি পয়েন্টে ভুল।

আছে দুই উপায়ে কাজ ডিরেক্টরি ট্র্যাক হয়:

  • প্রতিটি প্রক্রিয়াটির জন্য, কার্নেল-স্পেস ডেটা স্ট্রাকচারে যে প্রক্রিয়াটি উপস্থাপিত হয়, কার্নেলটি সেই ডিরেক্টরিটির কার্যনির্বাহী এবং তার প্রক্রিয়ার জন্য মূল ডিরেক্টরিটির ভনোডের দুটি ভনোড উল্লেখ সংরক্ষণ করে। সাবেক রেফারেন্স দ্বারা সেট করা হয় chdir()এবং fchdir()সিস্টেম কল, দ্বারা আধুনিক chroot()। এগুলি প্রত্যক্ষভাবে পরোক্ষভাবে দেখতে পাবেন/procলিনাক্স অপারেটিং সিস্টেমগুলিতে বা fstatফ্রিবিএসডি- র কমান্ডের মাধ্যমে এবং :

    % fstat -p $$ | মাথা -n 5
    ব্যবহারকারী সিএমডি পিআইডি এফডি মাউন্ট ইনম মোড এসজেড | ডিভি আর / ডাব্লু
    জেডিবিপি zsh 92648 পাঠ / 24958 -r-xr-xr-x 702360 আর
    জেডিবিপি zsh 92648 সিটি / দেব 148 ক্রু - ডাব্লু ---- পিটিএস / 4 আরডাব্লু
    JdeBP zsh 92648 wd / usr / home / JdeBP 4 drwxr-xr-x 124 r
    জেডিবিপি zsh 92648 মূল / 4 drwxr-xr-x 35 আর
    % 

    পাথনাম রেজোলিউশনটি যখন চালিত হয়, সেই পথটি আপেক্ষিক বা পরম কিনা তা অনুসারে, এই রেফারেন্সড ভনোডগুলির এক বা অন্যটিতে শুরু হয়। ( …at()সিস্টেম কলগুলির একটি পরিবার রয়েছে যা তৃতীয় বিকল্প হিসাবে একটি ওপেন (ডিরেক্টরি) ফাইল বর্ণনাকারী দ্বারা উল্লিখিত vnode থেকে পথের নামটি শুরু করার অনুমতি দেয়))

    মাইক্রোকারেল ইউনিসে ডেটা স্ট্রাকচার প্রয়োগের জায়গাতে থাকে তবে এই ডিরেক্টরিগুলির জন্য খোলা রেফারেন্স রাখার নীতিটি একই থাকে।

  • অভ্যন্তরীণভাবে, এই ধরনের টু Z, Korn থেকে, বোর্ন আবার, C, Almquist শেল হিসাবে শাঁস মধ্যে শেল অতিরিক্ত কাজ ডিরেক্টরি অভ্যন্তরীণ স্ট্রিং ভেরিয়েবলের স্ট্রিং ম্যানিপুলেশন ব্যবহার ট্র্যাক রাখে। এটি যখনই কল করার কারণ রয়েছে এটি এটি করে chdir()

    যদি কোনও আপেক্ষিক পথের নামের সাথে পরিবর্তিত হয়, তবে সেই নামটি যুক্ত করতে স্ট্রিংটি ম্যানিপুলেট করে। যদি কোনও একটি পরম পথের নাম পরিবর্তিত হয় তবে এটি স্ট্রিংটিকে নতুন নামের সাথে প্রতিস্থাপন করে। উভয় ক্ষেত্রেই, এটি স্ট্রিংটি অপসারণ .এবং ..উপাদানগুলিকে সংযুক্ত করে এবং প্রতীকী লিঙ্কগুলি তাদের লিঙ্ক-টু নামের সাথে প্রতিস্থাপনের জন্য তাড়াতে সামঞ্জস্য করে । ( উদাহরণস্বরূপ, এটির জন্য জেড শেলের কোড এখানে )

    অভ্যন্তরীণ স্ট্রিং ভেরিয়েবলের নামটি শেল ভেরিয়েবলPWD (বা cwdসি শেলগুলিতে) দ্বারা ট্র্যাক করা হয় । PWDশেল দ্বারা তৈরি প্রোগ্রামগুলিতে এটি পরিবেশগত পরিবর্তনশীল (নামকরণ ) হিসাবে প্রচলিত রফতানি হয় ।

কিছু ট্র্যাকিং এই দুটি পদ্ধতি দ্বারা প্রকাশ করা হয় -Pএবং -Lঅপশন cdএবং pwdশেল বিল্ট-ইন কমান্ড ও শেল 'বিল্ট-ইন মধ্যে পার্থক্য দ্বারা pwdকমান্ড এবং উভয় /bin/pwdকমান্ড বিল্ট-ইন pwdভালো জিনিস কমান্ড (অন্যদের মধ্যে) ভিআইএম এবং নিওভিম।

% এমকিডির এ; ln -sab 
% (সিডি বি; পিডব্লিউডি; / বিন / পিডাব্লুডি; প্রিন্টেনভ পিডাব্লুডি)
, / Usr / হোম / JdeBP / খ
, / Usr / হোম / JdeBP / একটি
, / Usr / হোম / JdeBP / খ
% (সিডি বি; পিডব্লিউডি-পি; / বিন / পিডব্লুডেপি)
, / Usr / হোম / JdeBP / একটি
, / Usr / হোম / JdeBP / একটি
% (সিডি বি; পিডব্লিউড-এল; / বিন / পিডব্লিউড-এল)
, / Usr / হোম / JdeBP / খ
, / Usr / হোম / JdeBP / খ
% (সিডি -পি বি; পিডাব্লুডি; / বিন / পিডব্লিউডি; প্রিন্টেনভ পিডাব্লুডি)
, / Usr / হোম / JdeBP / একটি
, / Usr / হোম / JdeBP / একটি
, / Usr / হোম / JdeBP / একটি
% (সিডি বি; পিডাব্লুডি = / হ্যালো / সেখানে / বিন / পিডাব্লুডল)
, / Usr / হোম / JdeBP / একটি
% 

যেমন আপনি দেখতে পাচ্ছেন: "লজিকাল" ওয়ার্কিং ডিরেক্টরি প্রাপ্ত করা PWDশেল ভেরিয়েবলটি দেখার বিষয় (বা শেল প্রোগ্রামটি না হলে পরিবেশ পরিবর্তনশীল); যদিও "ফিজিক্যাল" ওয়ার্কিং ডিরেক্টরি পাওয়া getcwd()লাইব্রেরির ফাংশনকে কল করার বিষয় ।

বিকল্পটি ব্যবহার করার সময় /bin/pwdপ্রোগ্রামটির ক্রিয়াকলাপটি -Lকিছুটা সূক্ষ্ম। এটি উত্তরাধিকার সূত্রে প্রাপ্ত পরিবেশের পরিবর্তনশীলের মানকে বিশ্বাস করতে পারে নাPWD । সর্বোপরি, এটি শেল দ্বারা চালিত হওয়া উচিত নয় এবং অন্তর্বর্তী প্রোগ্রামগুলি PWDপরিবেশকে পরিবর্তনশীল করার শেলটির প্রক্রিয়াটি সর্বদা কার্যক্ষম ডিরেক্টরিটির নাম অনুসরণ করতে পারে না । অথবা কেউ কেবল সেখানে যা করতে পারে তা করতে পারে।

সুতরাং এটি কী করে তা (পসিক্স স্ট্যান্ডার্ড যেমনটি বলেছে) যাচাই করে দেখুন যে প্রদত্ত নামটি PWDএকই নাম হিসাবে একই ফলন করেছে .যা সিস্টেম কল ট্রেসের সাহায্যে দেখা যায়:

% ln -sac 
% (সিডি বি; ট্রাস / বিন / pwd -L 3> & 1 1> & 2 2> & 3 | গ্রেপ-ই '^ স্ট্যাট | __getcwd') 
স্ট্যাটাস ("/ usr / home / JdeBP / b", { মোড = drwxr-xr-x, inode = 120932, আকার = 2, blksize = 131072}) = 0 (0x0) 
স্ট্যাট ("।", {মোড = drwxr-xr-x, ইনোড = 120932, আকার = 2, blksize = 131072}) = 0 (0x0)
, / Usr / হোম / JdeBP / খ
% (সিডি বি; পিডাব্লুডি = / ইউএসআর / লোকাল / ইত্যাদি ট্রাস / বিন / পিডব্লু-এল 3> & 1 1> & 2 2 & & 3 | গ্রেপ-ই '^ স্ট্যাট | __getcwd') 
স্ট্যাটাস ("/ usr / স্থানীয় / ইত্যাদি" , {মোড = drwxr-xr-x, ইনোড = 14835, আকার = 158, blksize = 10240}) = 0 (0x0) 
স্ট্যাট ("।", {মোড = drwxr-xr-x, ইনোড = 120932, আকার = 2 , blksize = 131072}) = 0 (0x0)
__getcwd ("/ usr / home / JdeBP / a", 1024) = 0 (0x0)
, / Usr / হোম / JdeBP / একটি
% (সিডি বি; পিডাব্লুডি = / হ্যালো / সেখানে ট্রাস / বিন / পিডব্লুড-এল 3> & 1 1> & 2 2 & & 3 | গ্রেপ-ই '^ স্ট্যাট | __getcwd') 
স্ট্যাটাস ("/ হ্যালো / সেখানে", 0x7fffffffe730) ইআরআর # 2 'এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই' 
__getcwd ("/ usr / home / JdeBP / a", 1024) = 0 (0x0)
, / Usr / হোম / JdeBP / একটি
% (সিডি বি; পিডাব্লুডি = / ইউএসআর / হোম / জেডিবিপি / সি ট্রাস / বিন / পিডব্লু-এল 3> & 1 1> & 2 2> & 3 | গ্রেপ-ই '^ স্ট্যাট | __getcwd') 
স্ট্যাটাস ("/ 
ইউএসআর / হোম / জেডিবিপি / সি ", {মোড = ড্রওএক্সআর-এক্সআর-এক্স, ইনোড = 120932, আকার = 2, ব্লকসাইজ = 131072}) = 0 (0x0) স্ট্যাট ("। ", {মোড = ড্রওএক্সআর-এক্সআর-এক্স, ইনোড = 120932 , আকার = 2, blksize = 131072}) = 0 (0x0)
, / Usr / হোম / JdeBP / C
%

যেমন আপনি দেখতে পাচ্ছেন: এটি কেবল তখনই কল করে getcwd()যখন এটি কোনও অমিল সনাক্ত করে; এবং এটি PWDস্ট্রিংয়ে সেট করে বোকা বানানো যেতে পারে যা প্রকৃতপক্ষে একই ডিরেক্টরিটির নাম দেয়, তবে অন্য কোনও রুট দিয়ে।

getcwd()লাইব্রেরি ফাংশন তার নিজের অধিকার একটি বিষয়। তবে প্রিসিসের কাছে:

  • মূলত এটি নিখুঁতভাবে একটি লাইব্রেরির ফাংশন ছিল যা কার্য ডিরেক্টরি থেকে বার বার ডিরেক্টরিতে ওয়ার্কিং ডিরেক্টরিটি অনুসন্ধান করার চেষ্টা করে একটি মূল নামটি মূল থেকে শুরু করে দেয় ..। এটি যখন লুপে পৌঁছেছিল তখন এটি ..তার কার্যক্ষম ডিরেক্টরি হিসাবে একই ছিল বা যখন পরবর্তীটি খোলার চেষ্টা করার সময় ত্রুটি হয়েছিল ..। এটি প্রচ্ছদের অধীনে প্রচুর সিস্টেম কল হবে।
  • আজকাল পরিস্থিতি কিছুটা জটিল। FreeBSD 'র উপর, উদাহরণস্বরূপ (এই হিসাবে ভাল অন্যান্য অপারেটিং সিস্টেমের জন্য সত্য হচ্ছে), এটা হল একটি সত্য সিস্টেম কল, যেমন আপনি সিস্টেম কল আগের দেওয়া ট্রেস মধ্যে দেখতে পারবেন না। ওয়ার্কিং ডিরেক্টরি vnode থেকে মূল পর্যন্ত সমস্ত ট্র্যাভারসাল একক সিস্টেমে কল করা হয়ে থাকে, যা কার্নেল মোড কোডের ডিরেক্টরি প্রবেশের ক্যাশে সরাসরি প্রবেশাধিকারের মতো পথের নাম উপাদানগুলির আরও অনেক দক্ষতার সাথে ব্যবহার করার মতো জিনিসগুলির সুবিধা গ্রহণ করে।

    তবে, নোট করুন যে এমনকি ফ্রিবিএসডি এবং অন্যান্য অপারেটিং সিস্টেমগুলিতেও কার্নেল স্ট্রিং সহ ওয়ার্কিং ডিরেক্টরিটি ট্র্যাক করে না

নেভিগেট করা ..আবার তার নিজস্ব বিষয়। আরেকটি সারসংক্ষেপ: ডিরেক্টরি সাধারনত (যদিও হিসাবে ইতিমধ্যে, এই হয় উল্লিখিত যদিও না প্রকৃত ধারণ প্রয়োজন) ..ডিস্ক উপর ডিরেক্টরির ডাটা স্ট্রাকচার, কার্নেল প্রতিটি ডিরেক্টরির vnode নিজেই পেরেন্ট ডাইরেক্টরি ট্র্যাক করে এবং এইভাবে নেভিগেট করতে পারেন ..কোনো vnode ওয়ার্কিং ডিরেক্টরি। এটি মাউন্টপয়েন্ট এবং পরিবর্তিত মূল প্রক্রিয়াগুলি দ্বারা কিছুটা জটিল, যা এই উত্তরের ক্ষেত্রের বাইরে।

সরাইয়া

উইন্ডোজ এনটি আসলে একই কাজ করে। প্রসেস প্রতি একক ওয়ার্কিং ডিরেক্টরি রয়েছে, SetCurrentDirectory()এটিপি কল দ্বারা সেট এবং সেই ডিরেক্টরিতে কোনও (অভ্যন্তরীণ) ওপেন ফাইল হ্যান্ডেলের মাধ্যমে কার্নেল দ্বারা ট্র্যাক করা প্রতিটি প্রক্রিয়া; এবং পরিবেশের ভেরিয়েবলগুলির একটি সেট রয়েছে যা উইন 32 প্রোগ্রামগুলি (কেবল কমান্ড ইন্টারপ্রেটার নয়, তবে সমস্ত উইন 32 প্রোগ্রাম) একাধিক ওয়ার্কিং ডিরেক্টরী (প্রতিটি ড্রাইভের জন্য) এর নামগুলি ট্র্যাক করতে ব্যবহার করে, যখনই তারা ডিরেক্টরি পরিবর্তন করে সেগুলিতে সংযোজন বা ওভাররাইট করে।

প্রচলিতভাবে, ইউনিক্স এবং লিনাক্স অপারেটিং সিস্টেমের ক্ষেত্রে বিপরীতে, উইন 32 প্রোগ্রামগুলি ব্যবহারকারীদের কাছে এই পরিবেশের পরিবর্তনশীলগুলি প্রদর্শন করে না। উইন্ডোজ এনটি-তে চলমান ইউনিক্সের মতো সাবসিস্টিমে কেউ কখনও কখনও সেগুলি দেখতে পাবে, তবুও কমান্ড দোভাষীদের SETকমান্ডকে একটি বিশেষ উপায়ে ব্যবহার করে।

আরও পড়া


1
এটি আমার প্রত্যাশার চেয়ে অনেক বেশি। আপনাকে ধন্যবাদ, এবং আরও পড়ার জন্য অতিরিক্ত ধন্যবাদ!
প্রতিক্রিয়া জানান

doc.cat-v.org/plan_9/4th_edition/papers/lexnames সঙ্গে সমস্যা কিছু সম্পর্কে আলোচনা ..Plan9 প্রেক্ষাপটে,
ইকারুস

@ জেডিবিপি: সম্ভবত আমি কিছু মিস করছি। আপনি বলবেন, "অভ্যন্তরীণভাবে, মধ্যে ..., ব্যাশ, ... এবং ..., শেল অতিরিক্ত কাজ ডিরেক্টরি অভ্যন্তরীণ স্ট্রিং ভেরিয়েবলের স্ট্রিং ম্যানিপুলেশন ব্যবহার ট্র্যাক রাখে। …, এটি মুছে ফেলা .এবং ..উপাদানগুলি সরানো এবং প্রতীকী লিঙ্কগুলি তাদের লিঙ্ক-টু নামের সাথে প্রতিস্থাপনের জন্য তাড়াতে সামঞ্জস্য করে … অভ্যন্তরীণ স্ট্রিং ভেরিয়েবলের নামটি শেল ভেরিয়েবল দ্বারা চিহ্নিত করা হয় PWD... "(জোর যুক্ত করা হয়েছে)। … (চালিয়ে যাওয়া)
জি-ম্যান বলেছেন

(চালিয়ে যাওয়া) ... তবে আপনার উদাহরণটি কমান্ডের পরে PWD= কমান্ডের …/bপরে দেখায় cd b, যদিও bএটি একটি প্রতীকী লিঙ্ক a- সুতরাং শেলটি a -> bলিঙ্কটি "পিছু হটা " করে না । আপনি ভুল ব্যাখ্যা করেছেন, না আমি ভুল লিখেছি?
জি-ম্যান বলেছেন

আমি কেবল একটি সাইড পয়েন্টে লক্ষ্য করেছি এবং আপনাকে বিশদ বিবরণের জন্য কোডটি দেখিয়েছি। কখন এবং কীভাবে তারা প্রতীকী লিঙ্কগুলি তাড়া করার সিদ্ধান্ত নেন বা না করার জন্য বিভিন্ন শেলের ম্যানুয়ালগুলি দেখুন। জেড শেল হ্যান্ডলি তার শেল বিকল্পটিকে কল করে যে সিদ্ধান্তের সূত্রের একটি অংশ CHASE_LINKS,।
জেডিবিপি

1

কার্নেল ডিরেক্টরি বা ফাইলের নাম রাখে না; একটি ফাইল বা ডিরেক্টরি একটি ইনোড / ডিভাইস জোড়া দ্বারা কার্নেলটিতে প্রতিনিধিত্ব করা হয়। মত সিস্টেম কল chdir(), open()ইত্যাদি (যেমন প্যারামিটার হিসাবে একটি পাথ, যা পরম হতে পারে নিতে /etc/passwd), অথবা বর্তমান ডিরেক্টরির আপেক্ষিক (উদাহরণ: Documents, ..)। যখন একটি প্রক্রিয়া সঞ্চালিত হয় chdir("Documents"), Documentsবর্তমান কার্যক্ষম ডিরেক্টরিতে একটি অনুসন্ধান করা হয় এবং প্রক্রিয়াটির কার্যকারী ডিরেক্টরিটি এই ডিরেক্টরিটি উল্লেখ করার জন্য আপডেট করা হয়। কার্নেলের দৃষ্টিকোণ থেকে, ".." নামে কোনও বিশেষ কিছুই নেই, এটি কেবল ফাইল সিস্টেমে একটি কনভেনশন ..যা পিতামাতাকে নির্দেশ করে।

getcwd()ফাংশন একটি সিস্টেম কল, কিন্তু রুট ডিরেক্টরিটি তার উপায় আপ কাজ করার জন্য, পথে পাথ উপাদান নাম রেকর্ডিং আছে একটি লাইব্রেরি ফাংশন নয়।


0

মজার বিষয়, traditionতিহ্যগতভাবে cd ..তুলনায় অনেক সহজ pwd। নামের ডিরেক্টরিগুলি ..ফাইল সিস্টেমে স্পষ্টভাবে স্থাপন করা হয়। সিস্টেমটি বর্তমান ডিরেক্টরিটির ডিভাইস / ইনোডের উপর নজর রাখে, সুতরাং cd ..বা আরও সঠিকভাবে সিস্টেম কলটি chdir("..")কেবল "ডিরেক্টরি" বর্তমান ডিরেক্টরিটির ইনোডের সাথে সম্পর্কিত ফাইলটিতে এবং বর্তমান ডিরেক্টরিটির ডিভাইস / আইনোডকে পরিবর্তিত করে মান সেখানে পাওয়া যায়।

pwd(আরও নিখুঁতভাবে /bin/pwd) ..লিঙ্কগুলি ধারাবাহিকভাবে অনুসরণ করে এবং যে ডিরেক্টরিটি মূল নির্দেশিকাটিতে পৌঁছানো না হওয়া অবধি উল্লিখিত নামগুলির তালিকা একত্রিত করা হয় সেগুলি সম্পর্কিত আইওডটি সন্ধান না করা পর্যন্ত সম্পর্কিত ডিরেক্টরিগুলি পড়ে (উল্লেখযোগ্যভাবে কোনও ..এন্ট্রি নেই) reads

এখন এটি আসল নিম্ন-স্তরের প্রাথমিক আচরণ। প্রকৃত শেল কমান্ড pwdপরিবর্তে বর্তমান পথের নামটি ক্যাশে করার বিভিন্ন কৌশল অবলম্বন করে। তবে মূলত, এটি কেবলমাত্র এর ইনোড যা বাস্তবে পরিচিত। এর দ্বারা বোঝানো হয় যে একবার ডিরেক্টরিতে নেভিগেট করার জন্য সিমলিংকগুলি ব্যবহার করা হলে বর্তমান শেল এবং সিস্টেমের বর্তমান কাজের ডিরেক্টরি নাম ধারণাটি /bin/pwdবিভক্ত হতে পারে।

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