আমি পারি cat /dev
, পারি ls /dev
, পারি না less /dev
। cat
আমাকে cat
এই ডিরেক্টরিটি ছাড়া অন্য কোনও ডিরেক্টরি কেন দেয় ?
আমি পারি cat /dev
, পারি ls /dev
, পারি না less /dev
। cat
আমাকে cat
এই ডিরেক্টরিটি ছাড়া অন্য কোনও ডিরেক্টরি কেন দেয় ?
উত্তর:
Icallyতিহাসিকভাবে (ভি 7 ইউএনআইএক্স অবধি বা প্রায় 1979) read
সিস্টেম কলটি ফাইল এবং ডিরেক্টরি উভয় ক্ষেত্রেই কাজ করে। read
ডিরেক্টরিতে কোনও সাধারণ প্রোগ্রাম কাঠামো ফিরে আসে যা কোনও ব্যবহারকারী প্রোগ্রাম ডিরেক্টরি এন্ট্রিগুলি পাওয়ার জন্য বিশ্লেষণ করে। প্রকৃতপক্ষে, ভি 7 ls
সরঞ্জামটি ঠিক এটি করেছিল - read
কোনও ডিরেক্টরিতে ফলাফলের কাঠামোগুলি, কাঠামোগত তালিকা বিন্যাসে আউটপুট পার্স করে।
ফাইল সিস্টেমগুলি আরও জটিল হয়ে উঠার সাথে সাথে, এই "সাধারণ" ডেটা কাঠামোটি আরও জটিল হয়ে উঠল, যেখানে readdir
প্রোগ্রামগুলির আউটপুটকে বিশ্লেষণে সহায়তা করার জন্য একটি লাইব্রেরি ফাংশন যুক্ত করা হয়েছিল read(directory)
। বিভিন্ন সিস্টেমে এবং ফাইল-সিস্টেমে বিভিন্ন ডিস্ক ফর্ম্যাট থাকতে পারে, যা জটিল হয়ে উঠছিল।
যখন সান নেটওয়ার্ক ফাইল সিস্টেম (এনএফএস) প্রবর্তন করল, তারা অন ডিস্ক ডিরেক্টরি কাঠামো পুরোপুরি বিমূর্ত করতে চেয়েছিল। তাদের read(directory)
প্রত্যাবর্তনকে ডিরেক্টরিটির প্ল্যাটফর্ম-স্বতন্ত্র প্রতিনিধিত্ব করার পরিবর্তে , তারা একটি নতুন সিস্টেম কল যুক্ত করেছে getdirents
- এবং read
নেটওয়ার্ক-মাউন্টড ডিরেক্টরিতে নিষিদ্ধ । এই সিস্টেম কলটি বিভিন্ন ইউনিক্স স্বাদে সমস্ত ডিরেক্টরিতে কাজ করার জন্য দ্রুত রূপান্তরিত হয়েছিল, এটি ডিরেক্টরিগুলির বিষয়বস্তু প্রাপ্তির জন্য এটি ডিফল্ট উপায়। ( Https://utcc.utoronto.ca/~cks/space/blog/unix/ReaddirHistory থেকে ইতিহাস বিমৃত )
কারণ readdir
এখন ডিফল্ট ভাবে নির্দেশিকা পড়া হয়, read(directory)
সাধারণত অধিকাংশ আধুনিক অপারেটিং সিস্টেমের উপর বাস্তবায়িত হয়নি (ফিরে -EISDIR) (QNX, উদাহরণস্বরূপ, একটি উল্লেখযোগ্য ব্যতিক্রম যা কার্যকরী হয় readdir
যেমন read(directory)
)। তবে বেশিরভাগ আধুনিক কার্নেলগুলিতে "ভার্চুয়াল ফাইল সিস্টেম" ডিজাইনের সাহায্যে ডিরেক্টরিটি পড়া কাজ করে কি না তা প্রকৃতপক্ষে পৃথক ফাইল সিস্টেমের উপর নির্ভর করে।
এবং প্রকৃতপক্ষে, ম্যাকোস-এ, devfs
মাউন্টপয়েন্টের অন্তর্নিহিত ফাইল সিস্টেমটি /dev
সত্যই পড়ার সমর্থন করে ( https://github.com/apple/darwin-xnu/blob/xnu-4570.1.46/bsd/miscfs/devfs/devfs_vnops.c#L629 ) :
static int
devfs_read(struct vnop_read_args *ap)
{
devnode_t * dn_p = VTODN(ap->a_vp);
switch (ap->a_vp->v_type) {
case VDIR: {
dn_p->dn_access = 1;
return VNOP_READDIR(ap->a_vp, ap->a_uio, 0, NULL, NULL, ap->a_context);
READDIR
যদি আপনি /dev
পড়ার চেষ্টা করেন তবে এটি স্পষ্টভাবে কল করে (অধীন ফাইলগুলি /dev
পৃথক ফাংশন দ্বারা পরিচালিত হয় devfsspec_read
)। সুতরাং, যদি কোনও প্রোগ্রাম read
সিস্টেমে কল কল করে /dev
, এটি সফল হবে এবং একটি ডিরেক্টরি তালিকা প্রাপ্ত করবে!
এটি কার্যকরভাবে এমন একটি বৈশিষ্ট্য যা ইউনিক্সের খুব প্রথম দিন থেকেই হোল্ডওভার এবং এটি খুব দীর্ঘ সময়ে স্পর্শ করা হয়নি। আমার একটি অংশ সন্দেহ করে যে এটি কিছু পিছনের সামঞ্জস্যতার কারণে রাখা হয়েছিল, তবে এটি সহজেই সত্য হতে পারে যে কেউ আসলেই কোনও ক্ষতি করছে না বলে বৈশিষ্ট্যটি সরাতে যথেষ্ট পাত্তা দেয় না।
কম কোনও পাঠ্য ফাইল ভিউয়ার, বিড়াল সালিসী ডেটা অনুলিপি করার একটি সরঞ্জাম। তাই আপনি এমন কিছু খোলেন না যাতে প্রচুর পরিমাণে ডেটা থাকবে বা খুব আশ্চর্যের সাথে আচরণ করবে তা নিশ্চিত করার জন্য কম এটি নিজের পরীক্ষা করে। অন্যদিকে, বিড়ালটির তেমন কোনও চেকিং নেই - কার্নেলটি যদি আপনাকে কিছু খুলতে দেয় (এমনকি এটি পাইপ বা ডিভাইস বা আরও খারাপ কিছু হলেও), বিড়াল এটি পড়বে।
তাহলে ওএস কেন বিড়ালকে ডিরেক্টরি খুলতে দেয় ? BSতিহ্যগতভাবে বিএসডি-স্টাইল সিস্টেমগুলিতে সমস্ত ডিরেক্টরি ফাইল হিসাবে পঠিত হতে পারে এবং প্রোগ্রামগুলি প্রথম স্থানে একটি ডিরেক্টরি তালিকাবদ্ধ করে: কেবলমাত্র ডিস্কে সঞ্চিত ডাইরেক্ট স্ট্রাকচারের ব্যাখ্যা দিয়ে।
পরবর্তী সময়ে, সেই অন-ডিস্ক স্ট্রাকচারগুলি কার্নেলের দ্বারা ব্যবহৃত নির্দেশ থেকে আলাদা হতে শুরু করে: যেখানে আগে ডিরেক্টরিটি একটি রৈখিক তালিকা ছিল, পরে ফাইল সিস্টেমগুলি হ্যাশ টেবিল, বি-ট্রি ইত্যাদি ব্যবহার শুরু করে। সুতরাং ডিরেক্টরিগুলি সরাসরি পড়া আর সোজা ছিল না - কার্নেল এটির জন্য উত্সর্গীকৃত ফাংশন বৃদ্ধি করে। (আমি নিশ্চিত নই যে এটির মূল কারণ ছিল বা তারা মূলত অন্যান্য কারণে যেমন ক্যাশিংয়ের জন্য যুক্ত করা হয়েছিল))
কিছু বিএসডি সিস্টেম আপনাকে পড়ার জন্য সমস্ত ডিরেক্টরি খুলতে দেয়; আমি জানি না যে তারা আপনাকে ডিস্ক থেকে কাঁচা ডেটা দেয়, অথবা তারা পরিবর্তে কোনও এমুলেটেড ডায়রেন্টের তালিকা ফিরিয়ে দেয় কিনা, বা তারা ফাইল-সিস্টেম চালককে সিদ্ধান্ত নিতে দেয় কিনা।
সুতরাং সম্ভবত ম্যাকোস হ'ল সেই অপারেটিং সিস্টেমগুলির মধ্যে একটি যেখানে ফাইল সিস্টেম ডেটা সরবরাহ করবে ততক্ষণ কার্নেল এটিকে অনুমতি দেয় । এবং পার্থক্যটি হ'ল এটি /dev
এমন একটি devfs
ফাইল সিস্টেমে যা প্রথম দিনগুলিতে এটির অনুমতি দেওয়ার জন্য লেখা হয়েছিল, যখন /
একটি এপিএফএস ফাইল সিস্টেমে রয়েছে যা আধুনিক সময়ে এই বৈশিষ্ট্যটিকে অপ্রয়োজনীয় হিসাবে বাদ দিয়েছে।
দাবি অস্বীকার: আমি আসলে বিএসডি বা ম্যাকোস নিয়ে কোনও গবেষণা করিনি। আমি শুধু এটি ডানা।
/etc
, তাই আমি এটি আমার মানদণ্ড হিসাবে ব্যবহার করেছি।
mount
বা /sbin/mount
তা দেখতে বর্তমানে যেখানে মাউন্ট হচ্ছে।
/dev
একটি ভার্চুয়াল ফাইল ব্যবহার করে সিস্টেম devfs
চালক যেহেতু /etc
অংশ /
ব্যবহার ফাইল সিস্টেম apfs
ড্রাইভার। সুতরাং কারণটি cat
একটি পড়বে এবং অন্যটি না হ'ল apfs
এবং devfs
চালকদের মধ্যে পার্থক্য ।
neofetch
জন্য এখানে :) i.imgur.com/3azpnDt.png