ইউনিক্স সিস্টেমে, কেন আমাদের exp পড়ার () `বা` লিখতে () লিখতে সক্ষম হতে ফাইলগুলি স্পষ্টভাবে `খুলুন ()? এবং` বন্ধ ()? ফাইলগুলি করতে হবে?


50

ইউনিক্স ফাইল সিস্টেম ডিজাইনে কেন open()এবং close()বিদ্যমান?

ওএস কি প্রথমবার সনাক্ত করতে পারে read()বা write()ডেকে আনা হয়েছিল এবং যা open()করতে পারে তা সাধারণত করতে পারে না?


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

18
কথ্য হিসাবে, আমি মনে করি এটি কেন open()বিদ্যমান তা সম্পর্কে আরও বেশি । "ওএস প্রথমবার () পড়া বা () লিখতে এবং যা খোলা () সাধারণত করত তা করতে পারে না?" সমাপনী কখন ঘটবে সে সম্পর্কিত কোনও পরামর্শ আছে ?
জোশুয়া টেলর

7
আপনি কীভাবে বলবেন read()বা write()কোন ফাইলটি অ্যাক্সেস করবেন? সম্ভবত পথ পাড়ি দিয়ে। আপনি যদি অ্যাক্সেস করার সময় ফাইলটির পথ পরিবর্তন করেন (দুই read()বা write()কল এর মধ্যে)?
ব্যবহারকারী 253751

2
এছাড়াও আপনি সাধারণত উপর প্রবেশাধিকার নিয়ন্ত্রণ না read()এবং write()শুধু, open()
পাভেল Šিমেরদা

6
@ জোহনি: আপনি সম্ভবত ভুলে যাচ্ছেন যে সেই দিনগুলিতে হার্ডওয়্যারটি কতটা সীমাবদ্ধ ছিল। যে PDP-7 এ ইউনিক্স প্রথম প্রয়োগ করা হয়েছিল তার (প্রতি গুগল) সর্বাধিক 64K র্যাম এবং একটি 0.333 মেগাহার্টজ ঘড়ি ছিল - আজকের দিনে সাধারণ মাইক্রোকন্ট্রোলারের চেয়ে কম। এই জাতীয় আবর্জনা সংগ্রহ করা, বা ফাইল অ্যাক্সেস পর্যবেক্ষণের জন্য সিস্টেম কোড ব্যবহার করা সিস্টেমকে তার হাঁটুর কাছে নিয়ে আসত।
জামেস্কেফ

উত্তর:


60

ডেনিস রিচি উল্লেখ করেছে «ইউনিক্স টাইম-শেয়ারিং সিস্টেম বিবর্তন» যে openএবং closeসহ read, writeএবং creatডান শুরু থেকে সিস্টেমের মধ্যে উপস্থিত ছিলেন।

আমি অনুমান করি যে একটি সিস্টেম ব্যতীত openএবং closeঅকল্পনীয় নয়, তবে আমি বিশ্বাস করি এটি নকশাটিকে জটিল করে তুলবে। আপনি সাধারণত এক নয়, একাধিক পঠন এবং লিখন কল করতে চান এবং ইউনিক্সের উদ্ভব যে সীমাবদ্ধ র‌্যামযুক্ত সেই পুরানো কম্পিউটারগুলির ক্ষেত্রে সম্ভবত এটি সত্য। আপনার বর্তমান ফাইল অবস্থান বজায় রাখার একটি হ্যান্ডেল থাকা এটিকে সহজ করে l যদি readবাwriteহ্যান্ডেলটি ফিরিয়ে দিতে হবে, তাদের একটি জোড়া - একটি হ্যান্ডেল এবং তাদের নিজস্ব ফেরতের স্থিতি ফিরে আসতে হবে। এই জুটির হ্যান্ডেল অংশটি অন্য সমস্ত কলগুলির জন্য অকেজো হবে, যা সেই ব্যবস্থাটিকে বিশ্রী করে তুলবে। কার্সারের স্থিতি কার্নেলে রেখে দেওয়া কেবল বাফারিংয়ের মাধ্যমেই দক্ষতা উন্নত করতে দেয়। পথ অনুসন্ধানের সাথে কিছু ব্যয় জড়িত - একটি হ্যান্ডেল থাকা আপনাকে এটি একবারে প্রদান করতে দেয়। তদ্ব্যতীত, ইউনিক্স ওয়ার্ল্ডভিউতে কিছু ফাইলের একটি ফাইল সিস্টেমের পথও নেই (বা হয় না - এখন তারা পছন্দ মতো জিনিস দিয়ে থাকে /proc/self/fd)।


7
পথ অনুসন্ধান এবং অনুমতি যাচাইকরণ ইত্যাদির ব্যয় ইত্যাদি অত্যন্ত তাৎপর্যপূর্ণ। আপনি যদি open/ ছাড়াই একটি সিস্টেম তৈরি closeকরতে চান, আপনি /dev/stdoutপাইপিংয়ের অনুমতি দেওয়ার মতো স্টাফ বাস্তবায়ন করতে ভুলবেন না ।
পিটার কর্ডেস

5
আমি মনে করি এর আরও একটি দিক হ'ল আপনি যখন ফাইলটি উন্মুক্ত রাখেন তখন একাধিক রিড ব্যবহার করার সময় আপনি সেই হ্যান্ডেলটিকে একই ফাইলটিতে রাখতে পারেন। অন্যথায়, আপনার এমন কেস থাকতে পারে যেখানে অন্য প্রক্রিয়াটি লিঙ্কমুক্ত হয় এবং একই নামের সাথে একটি ফাইল পুনরায় তৈরি করতে পারে এবং খণ্ডে কোনও ফাইল পড়া পুরোপুরি অসম্পূর্ণ হতে পারে। (এর কয়েকটি ফাইল সিস্টেমের উপরও নির্ভর করতে পারে))
ব্রুনো

2
আমি কাছাকাছি ছাড়াই একটি ডিজাইন করেছি (); আপনি ইনোড নম্বরটি পাস এবং () লিখতে এবং লিখতে () লিখুন। আমি খুব সহজেই খোলা () ছাড়াই করতে পারি না কারণ এখানেই রেজোলিউশন বাস করে।
জোশুয়া

3
@ জোশুয়া: এই জাতীয় সিস্টেমে মূলত বিভিন্ন শব্দার্থক শব্দ রয়েছে কারণ ইউনিক্স ফাইল বর্ণনাকারী ফাইলগুলি (আইওনড) উল্লেখ করে না তবে ফাইল বিবরণ খোলার জন্য দেয়, যা প্রদত্ত ফাইলের জন্য অনেকগুলি থাকতে পারে (ইনোড)।
আর ..

@Joshua, আপনি শুধু নতুন নামকরণ open()করার get_inode()এবং পুরো সিস্টেমের আরো অনমনীয় (অসম্ভব পড়া / একযোগে বিভিন্ন অবস্থানের একই ফাইলটি লিখতে) প্রণীত।
ভনব্র্যান্ড

53

তারপরে সমস্ত কল readএবং প্রতিটি writeকল প্রতিটি অপারেশনে এই তথ্যটি দিতে হবে:

  • ফাইলের নাম
  • ফাইলের অনুমতি
  • কলার সংযোজন করছে বা তৈরি করছে কিনা
  • কলারটি ফাইলটির সাথে কাজ করছে কিনা (অব্যবহৃত পঠন-বাফারগুলি বাতিল করতে এবং লিখন-বাফারগুলি সত্যই লেখা সমাপ্ত করে তা নিশ্চিত করতে)

কিনা আপনি স্বাধীন বিবেচনা কল open , read, writeএবং closeএকটি একক উদ্দেশ্য ইনপুট / আউটপুট চেয়ে সহজ হতে বার্তা আপনার নকশা দর্শনের উপর ভিত্তি করে। ইউনিক্স বিকাশকারীরা সাধারণ ক্রিয়াকলাপ এবং প্রোগ্রামগুলি ব্যবহার করতে পছন্দ করেছেন যা সমস্ত কিছু করে এমন একক ক্রিয়াকলাপ (বা প্রোগ্রাম) না হয়ে বিভিন্ন উপায়ে একত্রিত হতে পারে।


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

5
"ফাইল" এর প্রথমে কোনও নাম বা অনুমতি থাকতে পারে না; readএবং writeফাইল সিস্টেমে থাকা ফাইলগুলিতে সীমাবদ্ধ নয়, এবং ইউনিক্সে এটি একটি মৌলিক নকশার সিদ্ধান্ত, যেমন pjc50 ব্যাখ্যা করেছে।
রিইনারপোস্ট

1
এছাড়াও যেখানে ফাইলটি পড়ার ইন / লিখতে - শুরুতে শেষ, অথবা একটি অবাধ অবস্থান (সাধারণত গত পঠন / লিখন শেষে পরে অবিলম্বে হতে) - কার্নেল করার জন্য একটি মোড সঙ্গে (আপনার জন্য এই ট্র্যাক রাখে সমস্ত ফাইলের শেষে ফাইল লেখুন, বা অন্যথায় ফাইলগুলি শুরুতে অবস্থানের সাথে খোলা হয় এবং প্রতিটি পঠন / লেখার সাথে অগ্রসর হয় এবং এর সাথে সরানো যেতে পারে lseek)
র্যান্ডম 832

51

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

তোমার মত সহজ মান ইউনিক্স ইউটিলিটি অনেক তাকান grep, বিশেষ করে তাদের মূল সংস্করণে, আপনি বিজ্ঞপ্তি পাবেন যে, তারা কল অন্তর্ভুক্ত করবেন না open()এবং close()কিন্তু readwrite। ফাইল হ্যান্ডলগুলি শেল দ্বারা প্রোগ্রামের বাইরে সেট আপ করা হয় এবং এটি শুরু হওয়ার পরে পাস করা হয়। সুতরাং প্রোগ্রামটি কোনও ফাইলে বা অন্য কোনও প্রোগ্রামে লিখছে কিনা সেদিকে খেয়াল রাখতে হবে না।

পাশাপাশি open, ফাইল বর্ণনাকারী পাবার অন্যান্য উপায় আছে socket, listen, pipe, dup, এবং পাইপ মাধ্যমে ফাইল বর্ণনাকারী পাঠানোর জন্য একটি খুব হিথ রবিনসন প্রক্রিয়া: https://stackoverflow.com/questions/28003921/sending-file-descriptor-by-linux -সকেট

সম্পাদনা করুন: কিছু বক্তৃতা নোটগুলি ইন্ডিরিয়ারেশনের স্তরগুলি বর্ণনা করে এবং কীভাবে এটি O_APPEND সংবেদনশীলভাবে কাজ করতে দেয়। নোট করুন যে মেমোডিতে ইনোড ডেটা রাখার গ্যারান্টি দেয় যে পরবর্তী লিখিত ক্রিয়াকলাপের জন্য সিস্টেমে তাদের আবার আনতে হবে না।


1
এছাড়াও creat, এবং listenকোনও এফডি তৈরি করে না, তবে শোনার সময় কোনও অনুরোধ আসে যখন (এবং যদি) acceptনতুন (সংযুক্ত) সকেটের জন্য একটি এফডি প্রদান করে।
dave_thompson_085

18
এটা সঠিক উত্তর. ফাইল বর্ণনাকারীদের উপর অপারেশনের বিখ্যাত (ছোট) সেট হ'ল সমস্ত ধরণের সংস্থানগুলির জন্য যা একচেটিয়া API তৈরি করে যা ডেটা উত্পাদন করে বা গ্রহণ করে। এই ধারণাটি অত্যন্ত সফল। কোনও স্ট্রিং প্রকৃত অবস্থান (ইউআরএল কেউ?) এর সাথে সংস্থানীয় ধরণের সংস্থান সংজ্ঞা দিতে পারে তবে উপলভ্য র‌্যামের বেশিরভাগ শতাংশ দখল করে এমন স্ট্রিংগুলি অনুলিপি করতে (এটি পিডিপি 7 তে কী ছিল? 16 কেবি?) অত্যধিক বলে মনে হয়? ।
পিটার - মনিকা পুনরায়

সম্ভবত এটি যদি নিম্ন-স্তরের কল এবং শেল একই সাথে বিকশিত হত। তবে pipeইউনিক্সে উন্নয়ন শুরু হওয়ার কয়েক বছর পরে এটি চালু হয়েছিল।
টমাস ডিকি

1
@ থমাস ডিকি: যা কেবলমাত্র মূল নকশাটি কতটা ভাল তা দেখায়, যেহেতু এটি পাইপগুলিকে & সি :-) সরল প্রসারণের অনুমতি দেয়
জেমসেকফ ২

তবে সেই যুক্তির লাইন অনুসরণ করে, এই উত্তরটি নতুন কিছু সরবরাহ করে না।
থমাস ডিকি

10

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

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


7

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

সরলতার জন্য এটি পরিচালনাযোগ্য (অনেকগুলি সিস্টেম অ-একচেটিয়া ফাইল অ্যাক্সেস সমর্থন করে) হতে পারে বেশিরভাগ অ্যাপ্লিকেশন ধরে নেয় যে তাদের খোলা ফাইলগুলি পরিবর্তন হয় না।


5

কারণ আপনি যখন ধরে নিচ্ছেন যে ফাইলটি একই রকম থাকবে তখন ফাইলটির পথ চলতে পারে।


4

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

যদি ওএসের খোলা / বন্ধ না থাকে তবে তার সাথে readবা এর সাথে write, সেই ফাইল ক্রিয়াগুলি এখনও প্রতিটি এবং প্রতিটি সময় কোনও প্রাথমিককরণ, বাফার ফ্লাশিং / পরিচালনা ইত্যাদি সম্পাদন করতে হবে। পুনরাবৃত্তি পড়া এবং লেখার জন্য চাপিয়ে দেওয়ার জন্য এটি অনেকগুলি ওভারহেড।


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

1

ইউনিক্স মন্ত্রটি হ'ল "জিনিসগুলি করার এক উপায়" যার অর্থ ইচ্ছামত একত্রিত করার জন্য (পুনরায় ব্যবহারযোগ্য) টুকরাগুলিতে "ফ্যাক্টরিং" করা। উদাহরণস্বরূপ, এক্ষেত্রে ফাইল হ্যান্ডলগুলি তৈরি এবং ধ্বংসকে তাদের ব্যবহার থেকে আলাদা করুন। পাইপ এবং নেটওয়ার্ক সংযোগ সহ গুরুত্বপূর্ণ সুবিধাগুলি পরে এসেছিল (এগুলি ফাইল হ্যান্ডলগুলির মাধ্যমেও চালিত করা হয় তবে এগুলি অন্য উপায়ে তৈরি করা হয়)। চারপাশে ফাইল হ্যান্ডলগুলি চালিয়ে যাওয়া সক্ষম করা (যেমন তাদের "শিশুদের প্রসেসগুলিতে" ওপেন ফাইল "হিসাবে প্রেরণ করা যা exec(2)কোনও বেঁচে থাকে , এমনকি পাইপের মাধ্যমে সম্পর্কযুক্ত প্রক্রিয়াগুলিতেও) কেবল এইভাবেই সম্ভব। বিশেষত যদি আপনি কোনও সুরক্ষিত ফাইলে নিয়ন্ত্রিত অ্যাক্সেসের প্রস্তাব দিতে চান। সুতরাং আপনি যেমন খুলতে পারেন/etc/passwd লেখার জন্য, এবং কোনও শিশু প্রক্রিয়াতে পাস করুন যাতে লেখার জন্য ফাইলটি খোলার অনুমতি নেই (হ্যাঁ, আমি জানি এটি একটি হাস্যকর উদাহরণ, আরও বাস্তবের সাথে সম্পাদনা করতে নির্দ্বিধায়)।

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