আমি যখন কোনও ফাইল বর্ণনাকারী বন্ধ করি তখন কী হয়?


16

আমি ফাইল বর্ণনাকারী সহ পুরো ছবিটি পাওয়ার চেষ্টা করছি। বলুন আমার প্রসেস 1 রয়েছে যা প্রাথমিকভাবে এই ফাইল বর্ণনাকারী রয়েছে:

 _process1_
|          |
| 0 stdin  |
| 1 stdout |
| 2 stderr |
|__________|

তারপরে আমি ফাইল বর্ণনাকারী 1 বন্ধ করি:

close(1);

ফাইল বর্ণনাকারী 1 কার্নেলের ওপেন ফাইল সারণীতে স্টাডাউট FILE কাঠামোতে (পয়েন্টগুলি) অনুবাদ করে ।

ফাইল বর্ণনাকারী 1 এর উপরের কোডটির সাথে প্রক্রিয়াটির সারণী থেকে মুছে ফেলা হবে যা হয়ে যায়:

 _process1_
|          |
| 0 stdin  |
| 2 stderr |
|__________|

কিন্তু কার্নেলের মধ্যে কী ঘটে? না stdoutফাইলের গঠন deallocated না? কীভাবে সম্ভব যদি স্টডআউট একটি বিশেষ ফাইল (মনিটর) হয় এবং সম্ভবত অন্যান্য প্রক্রিয়া দ্বারা ব্যবহৃত হয়? কেবলমাত্র সাধারণ ফাইল (ফাইলের উদাহরণস্বরূপ) ফাইলের কাঠামো সম্পর্কে কী বলা যায়? যদি এই জাতীয় ফাইলটি অন্য কোনও প্রক্রিয়া দ্বারা ব্যবহৃত হয় তবে কী হবে?

উত্তর:


13

ফাইল বর্ণনাকারী 1 কর্নেলের ওপেন ফাইল সারণীর স্টাডাউট ফাইল ফাইলটিতে অনুবাদ করে।

এটি একটি ভুল বোঝাবুঝি। কার্নেলের ফাইল টেবিলটিতে ব্যবহারকারী-স্থান ফাইল কাঠামোগত কিছুই করার নেই।

যে কোনও ইভেন্টে, কার্নেলের দুটি মাত্রার ইন্ডিয়ারেশন থাকে। অভ্যন্তরীণ কাঠামো রয়েছে যা ফাইলটিই উপস্থাপন করে যা রেফারেন্স গণনা করা হয়। এখানে একটি "ওপেন ফাইলের বিবরণ" রয়েছে যা রেফারেন্স গণনা করা হয়। এবং তারপরে ফাইল হ্যান্ডেল রয়েছে, যা রেফারেন্স গণনা করা হয় না। ফাইল কাঠামোটি ইনোডের দিকেই নির্দেশ করে। ওপেন ফাইলের বিবরণে ওপেন মোড এবং ফাইল পয়েন্টার এর মতো জিনিস রয়েছে।

আপনি যখন কাছে কল করবেন, আপনি সর্বদা ফাইল হ্যান্ডেলটি বন্ধ করে দিন। যখন কোনও ফাইল হ্যান্ডেল বন্ধ থাকে, তখন এর উন্মুক্ত ফাইলের বিবরণে রেফারেন্স গণনা হ্রাস পায়। যদি এটি শূন্যে চলে যায় তবে ওপেন ফাইলের বিবরণটিও প্রকাশিত হয় এবং নিজেই ফাইলটিতে রেফারেন্স গণনা হ্রাস পায়। কেবলমাত্র শূন্যে গেলে কার্নেলের ফাইল কাঠামো মুক্ত হয়।

একটি প্রক্রিয়া রিসোর্স রিলিজ করার কোনও সুযোগ নেই অন্য একটি প্রক্রিয়া ব্যবহার করছে কারণ ভাগ করা সংস্থানগুলি রেফারেন্স গণনা করা হয়।


আপনার উত্তরে পরিভাষাটি বোঝার সাথে আমার কিছুটা সমস্যা আছে। আমি অনুমান করছি যে ফাইল পয়েন্টারটির অর্থ "ফাইল অফসেট"। আপনি কি বোঝাতে চেয়েছিলেন? এছাড়াও আপনি ফাইল হ্যান্ডেল বলতে কি বোঝাতে চেয়েছিলেন ?
গিপ

এটি সঠিক, "ফাইল অফসেট" দ্বারা, আমি সেই অফসেটটি বোঝাতে চাইছি যার পরে কোনও পাঠ্য বা লেখার ঘটনা ঘটবে। একটি "ফাইল হ্যান্ডেল" একটি প্রক্রিয়া এবং একটি উন্মুক্ত ফাইলের বর্ণনার মধ্যে একটি লিঙ্ক - এটি আপনি যখন ফিরে আসেনopen সফল ।
ডেভিড শোয়ার্টজ

6

এক্ষেত্রে অনেক কিছুই ঘটবে না। stdin, stdout, এবং stderr সব একই ফাইল বর্ণনাকারীর ক্লোন হতে থাকে। ফাইল বর্ণনাকারীর জন্য রেফারেন্স কাউন্টারটি একে একে হ্রাস পাবে। একই ফাইল বিবরণকারীটি সাধারণত শেলটি ধরে থাকে যা থেকে প্রোগ্রামটি চালিত হয়েছিল, সুতরাং ফাইল বিবরণী রাখা দরকার।

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

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


1
দুটি প্রশ্ন: (1) ফাইল বর্ণনাকারী কি সত্যই রেফ গণনা করা হয়? আপনি যখন কন্ট্রোল-ডি ক করেন cat > some.file, বিড়াল স্টিডিনে একটি ইওফ পায়, তবে শেলটি পায় না। (২) রেফারেন্স গণনা কেন? কেন কিছু ফর্সা আবর্জনা সংগ্রহের নয়? জিসি ব্যবহারকারীর জায়গায় আরও ভাল নয়?
ব্রুস এডিগার

বিলটি’র উত্তরের সম্প্রসারণ: সাধারণ ক্ষেত্রে স্টিডিন, স্টডআউট এবং স্ট্ডার কেবলমাত্র একটি টিটিওয়াই ডিভাইসে খোলা ফাইল হ্যান্ডল। সুতরাং আপনি যদি ফাইল হ্যান্ডেলটি বন্ধ করেন তবে সেই টিটিওয়াই ডিভাইসটি এখনও রয়েছে এবং পরবর্তী সময়ে আবারও খোলা যেতে পারে।
প্যাট্রিক

1
@ ব্রুসইডিগার: (১) যখন শেলটি চালায় cat > some.fileযে এটি আসলে যা করছে তা কাঁটাচুচানো, 'কিছু.ফাইল' খোলার এবং এটি বিবরণী 1 ফাইল করার জন্য বরাদ্দ করা হয়, তখন তা করে exec("cat")। যখন কোনও প্রক্রিয়া এক্সিকিউট করা হয় () 'ডি, তখন এটি ওপেন ফাইল বর্ণনাকারীদের উত্তরাধিকার সূত্রে প্রাপ্ত হয়।
প্যাট্রিক

@ ব্রুসইডিগার (২) রেফারেন্স গণনাটি আবর্জনা সংগ্রহের পুরোপুরি সূক্ষ্ম ফর্ম এটি যখন ডেটা স্ট্রাকচারে ব্যবহার করা হয় যা একই ধরণের অন্যান্য ডেটা স্ট্রাকচারের পয়েন্টার (বা পয়েন্টারগুলির শৃঙ্খলা অবশেষে) থাকে না। এছাড়াও, এটি কার্নেল স্পেসে ঘটছে (এটি খুব বেশি গুরুত্ব দেয় না)।
গিলস 'খারাপ হয়ে যাওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.