একটি ফাইল খোলার আসলে কি করতে পারে?


266

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

কিন্তু এই উন্মুক্ত অপারেশনটি আসলে কী করে?

সাধারণ ফাংশনগুলির জন্য ম্যানুয়াল পৃষ্ঠাগুলি আপনাকে 'পড়া / লেখার জন্য কোনও ফাইল খোলায়' ব্যতীত অন্য কিছু বলতে দেয় না:

http://www.cplusplus.com/reference/cstdio/fopen/

https://docs.python.org/3/library/functions.html#open

স্পষ্টতই, ফাংশনটির ব্যবহারের মাধ্যমে আপনি বলতে পারবেন যে এটিতে কোনও ধরণের অবজেক্ট তৈরি করা জড়িত যা কোনও ফাইল অ্যাক্সেস করতে সহায়তা করে।

এটি রাখার আরেকটি উপায় হ'ল, যদি আমি কোনও openফাংশন বাস্তবায়ন করি তবে এটি লিনাক্সে কী করা দরকার?


13
Cএবং লিনাক্স ফোকাস করার জন্য এই প্রশ্নটি সম্পাদনা ; যেহেতু লিনাক্স এবং উইন্ডোজ কি আলাদা হয়। অন্যথায়, এটি কিছুটা বিস্তৃত। এছাড়াও, যে কোনও উচ্চ স্তরের ভাষা সিস্টেমের জন্য সি সি এপিআই কল করে বা নির্বাহ করতে সি-তে সংকলন করে, সুতরাং "সি" এর স্তরে রেখে এটিকে সর্বনিম্ন সাধারণ ডিনোমিনেটরে রাখে।
জর্জ স্টিকার 16

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

উত্তর:


184

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

এই কারণেই fopenগ্রন্থাগারটির কার্যকারিতা বা পাইথনের openযুক্তিগুলি open(2)সিস্টেম কলের যুক্তিগুলির সাথে সাদৃশ্যপূর্ণ ।

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

আমি আমার নিজের কাজটি বাস্তবায়নে আগ্রহী নই; আপনি যদি পছন্দ করেন তবে 'ভাষার বাইরেও' কী চলছে তা বোঝার জন্য।

ইউনিক্স-এর মতো অপারেটিং সিস্টেমে একটি সফল কল open"ফাইল বর্ণনাকারী" ফেরত দেয় যা ব্যবহারকারী প্রক্রিয়া প্রসঙ্গে কেবল একটি পূর্ণসংখ্যা। এই বর্ণনাকারীর ফলস্বরূপ খোলা ফাইলটির সাথে ইন্টারঅ্যাক্ট করা যে কোনও কলগুলিতে প্রেরণ করা হয় এবং closeএটির কল করার পরে , বর্ণনাটি অবৈধ হয়ে যায়।

এটি লক্ষ করা জরুরী যে কলের কলটি openযাচাইকরণের পয়েন্টের মতো কাজ করে যেখানে বিভিন্ন চেক করা হয়। যদি সমস্ত শর্ত পূরণ -1না হয় তবে বর্ণনাকারীর পরিবর্তে কলটি ব্যর্থ হয়ে যায় এবং এতে ধরণের ত্রুটি নির্দেশিত হয় errno। প্রয়োজনীয় চেকগুলি হ'ল:

  • ফাইল বিদ্যমান কিনা;
  • কলিং প্রক্রিয়াটি নির্দিষ্ট মোডে এই ফাইলটি খোলার সুযোগ পেয়েছে কিনা। কলিং প্রক্রিয়ার সংশ্লিষ্ট আইডির সাথে ফাইল অনুমতি, মালিক আইডি এবং গ্রুপ আইডি মিলিয়ে এটি নির্ধারিত হয়।

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


2
এটি লক্ষণীয় যে ইউনিক্সের মতো ওএসে, ইন-কার্নেল স্ট্রাকচার ফাইল বর্ণনাকারীদের ম্যাপ করা হয়, তাকে "ওপেন ফাইলের বিবরণ" বলা হয়। সুতরাং প্রক্রিয়া এফডিগুলি কর্নেল অফডে ম্যাপ করা হয়। ডকুমেন্টেশন বুঝতে এটি গুরুত্বপূর্ণ। উদাহরণস্বরূপ, দেখুন man dup2এবং একটি মধ্যে তনিমা পরীক্ষা খোলা ফাইল বর্ণনাকারী (যার এমন কোন এফডি খোলা হতে হবে) এবং একটি খোলা ফাইল বিবরণ (ক OFD)।
রডরিগো

1
হ্যাঁ, অনুমতিগুলি খোলা সময়ে পরীক্ষা করা হয়। কার্নেলের "ওপেন" বাস্তবায়নের উত্সটি আপনি পড়তে পারেন: lxr.free-electrons.com/source/fs/open.c যদিও এটি বেশিরভাগ কাজ নির্দিষ্ট ফাইল সিস্টেম ড্রাইভারকে অর্পণ করে।
pjc50

1
(এক্সট 2 সিস্টেমে এটির জন্য ডিরেক্টরি ইনডির পড়া জড়িত যা কোন ইনোডে মেটাডেটা রয়েছে তা সনাক্ত করে, তারপরে সেই ইনোডটি ইনোড ক্যাশে লোড করা হবে Note নোট করুন যে "/ proc" এবং "/ sys" এর মতো সিউডোফাইলে সিস্টেম থাকতে পারে যা নির্বিচারে জিনিসগুলি করতে পারে আপনি যখন কোনও ফাইল খুলবেন)
pjc50

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

2
মূল্যায়ন এবং / বা লক তৈরি ভুলে যাবেন না। এগুলি ভাগ করা যায়, বা একচেটিয়া হতে পারে এবং পুরো ফাইলটি, বা এর একটি অংশকেই প্রভাবিত করতে পারে।
থিনকেয়

83

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

0  int sys_open(const char *filename, int flags, int mode) {
1      char *tmp = getname(filename);
2      int fd = get_unused_fd();
3      struct file *f = filp_open(tmp, flags, mode);
4      fd_install(fd, f);
5      putname(tmp);
6      return fd;
7  }

সংক্ষেপে, এখানে কোডটি লাইনে কী করে তা করে:

  1. কার্নেল-নিয়ন্ত্রিত মেমরির একটি ব্লক বরাদ্দ করুন এবং ব্যবহারকারী-নিয়ন্ত্রিত মেমরি থেকে ফাইলের নামটি এতে অনুলিপি করুন।
  2. একটি অব্যবহৃত ফাইল বর্ণনাকারী বাছাই করুন, যা আপনি বর্তমানে খোলার ফাইলগুলির বর্ধনযোগ্য তালিকায় একটি পূর্ণসংখ্যার সূচক হিসাবে ভাবতে পারেন। প্রতিটি প্রক্রিয়ার নিজস্ব তালিকা রয়েছে যদিও এটি কার্নেল দ্বারা রক্ষণাবেক্ষণ করা হয়; আপনার কোডটি সরাসরি এটি অ্যাক্সেস করতে পারে না। তালিকার একটি এন্ট্রিতে ডিস্কের বাইটগুলি টানতে অন্তর্নিহিত ফাইল সিস্টেমটি যা ব্যবহার করবে তা যেমন ইনোড নম্বর, প্রক্রিয়া অনুমতি, খোলা পতাকা এবং আরও কিছু অন্তর্ভুক্ত contains
  3. filp_openফাংশন বাস্তবায়ন হয়েছে

    struct file *filp_open(const char *filename, int flags, int mode) {
            struct nameidata nd;
            open_namei(filename, flags, mode, &nd);
            return dentry_open(nd.dentry, nd.mnt, flags);
    }

    যা দুটি কাজ করে:

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

  5. কার্নেল-নিয়ন্ত্রিত মেমরির বরাদ্দ ব্লক মুক্ত করুন।
  6. ফাইল বর্ণনাকারী, যা মত ফাইল অপারেশন ফাংশন প্রেরণ করা সম্ভব ফিরুন read(), write()এবং close()। এগুলির প্রত্যেকটি কার্নেলের উপর নিয়ন্ত্রণ সরিয়ে দেবে, যা প্রক্রিয়াটির তালিকার সাথে সম্পর্কিত ফাইল পয়েন্টারটি অনুসন্ধান করতে ফাইল বর্ণনাকারী ব্যবহার করতে পারে এবং সেই ফাইল পয়েন্টারে থাকা তথ্যটি পড়ার, লেখার বা বন্ধ করার জন্য ব্যবহার করতে পারে।

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


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

  • open_namei()এবং dentry_open()ফাইল সিস্টেমের কোড, যা কার্নেলেরও একটি অংশ, ফাইল এবং ডিরেক্টরিগুলির জন্য মেটাডেটা এবং সামগ্রী অ্যাক্সেস করতে অনুরোধ করে। ফাইলসিস্টেম ডিস্ক থেকে কাঁচা বাইট পড়ে এবং ফাইল ও ডিরেক্টরিগুলি একটি গাছ হিসাবে যারা বাইট নিদর্শন ব্যাখ্যা করে।
  • ড্রাইভ থেকে এই কাঁচা বাইটগুলি পেতে ফাইল সিস্টেমে আবার কার্নেলের একটি অংশ, ব্লক ডিভাইস স্তর ব্যবহার করে । (মজার সত্য: লিনাক্স আপনাকে ব্যবহার করে /dev/sdaএবং এর মতো ব্লক ডিভাইস স্তর থেকে কাঁচা ডেটা অ্যাক্সেস করতে দেয় ))
  • ব্লক ডিভাইস স্তরটি স্টোরেজ ডিভাইস ড্রাইভারকে অনুরোধ করে, যা কার্নেল কোডও, "রিড সেক্টর এক্স" এর মতো একটি মাঝারি স্তরের নির্দেশনা থেকে মেশিন কোডের পৃথক ইনপুট / আউটপুট নির্দেশগুলিতে অনুবাদ করতেআইডিই , (এস) এটিএ , এসসিএসআই , ফায়ারওয়্যার সহ বিভিন্ন ধরণের স্টোরেজ ডিভাইস ড্রাইভার রয়েছে, যা কোনও ড্রাইভ ব্যবহার করতে পারে এমন বিভিন্ন যোগাযোগের মানের সাথে সঙ্গতিপূর্ণ। (দ্রষ্টব্য যে নামকরণটি একটি গোলযোগ।
  • আই / ও নির্দেশাবলী শারীরিক ড্রাইভে যাওয়ার তারে বৈদ্যুতিক সংকেত প্রেরণ ও গ্রহণ করতে প্রসেসর চিপ এবং মাদারবোর্ড নিয়ামকটির অন্তর্নির্মিত ক্ষমতাগুলি ব্যবহার করে। এটি হার্ডওয়্যার, সফ্টওয়্যার নয়।
  • তারের অন্য প্রান্তে, ডিস্কের ফার্মওয়্যার (এম্বেডড কন্ট্রোল কোড) প্লাটারগুলিকে স্পিন করতে এবং মাথাগুলি (এইচডিডি) সরাতে বা একটি ফ্ল্যাশ রম সেল (এসএসডি) পড়তে বা ডেটা অ্যাক্সেস করার জন্য প্রয়োজনীয় যা কিছু বোঝায় বৈদ্যুতিন সংকেতকে ব্যাখ্যা করে এই ধরণের স্টোরেজ ডিভাইস।

ক্যাশে দেওয়ার কারণে এটি কিছুটা ভুলও হতে পারে । :-P সিরিয়াসলি যদিও, এখানে অনেক বিবরণ রয়েছে যা আমি রেখে এসেছি - একজন ব্যক্তি (আমি না) এই পুরো প্রক্রিয়াটি কীভাবে কাজ করে তা বর্ণনা করে একাধিক বই লিখতে পারে। তবে এটি আপনাকে ধারণা দেয়।


67

আপনি যে ফাইল ফাইল বা অপারেটিং সিস্টেমের বিষয়ে কথা বলতে চান তা আমার পক্ষে ভাল। নিস!


একটি জেডএক্স স্পেকট্রামে, একটি LOADকমান্ড শুরু করার মাধ্যমে অডিও ইন লাইনটি পড়ে সিস্টেমটি একটি শক্ত লুপের মধ্যে ফেলে দেওয়া হবে।

স্টার্ট-অফ ডেটা একটি ধ্রুবক সুর দ্বারা নির্দেশিত হয় এবং এর পরে লম্বা / সংক্ষিপ্ত ডালগুলির অনুক্রম অনুসরণ করা হয়, যেখানে একটি বাইনারিগুলির জন্য একটি ছোট ডাল 0এবং বাইনারিগুলির জন্য দীর্ঘতর হয় 1( https://en.wikedia.org/ উইকি / জেডএক্স_স্পেক্ট্রাম_সফটওয়্যার )। টাইট লোড লুপ বিটগুলি সংগ্রহ করে যতক্ষণ না এটি কোনও বাইট (8 বিট) পূরণ করে, এটিকে মেমরিতে রাখে, মেমরি পয়েন্টারটি বাড়ায়, তারপরে আরও বিটগুলির জন্য স্ক্যান করতে ফিরে আসে।

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

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


এই উত্তরের একটি সামান্য পটভূমি

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

"টাইট লুপ" উল্লেখ করা হয়েছে কারণ (1) সিপিইউ, একটি জেড 80-এ (যদি মেমরিটি পরিবেশন করে) সত্যিই ধীর ছিল: 3.5 মেগাহার্টজ, এবং (2) স্পেকট্রামের কোনও অভ্যন্তরীণ ঘড়ি ছিল না! তার মানে এটি প্রতিটিটির জন্য সঠিকভাবে টি-রাজ্যগুলির (নির্দেশের সময়) গণনা রাখতে হয়েছিল । একক। নির্দেশ. এই লুপটির ভিতরে, কেবল সঠিক বীপের সময় বজায় রাখতে।
ভাগ্যক্রমে, সেই কম সিপিইউ গতির স্বতন্ত্র সুবিধা ছিল যে আপনি কোনও কাগজের টুকরোতে চক্রের সংখ্যা এবং এইভাবে তারা গ্রহণ করতে পারে এমন সত্যিকারের সময় গণনা করতে পারবেন।


10
@ বিলডুডগার: আচ্ছা হ্যাঁ তবে এটি একটি ন্যায্য প্রশ্ন (আমি আপনাকে বোঝাতে চাইছি)। আমি "খুব বিস্তৃত" হিসাবে বন্ধ করার পক্ষে ভোট দিয়েছি এবং আমার উত্তরটি বোঝানো হচ্ছে যে প্রশ্নটি আসলে কীভাবে চূড়ান্ত rate
usr2564301

8
আমি মনে করি আপনি উত্তরটি খুব বেশি সম্প্রসারণ করছেন। জেডএক্স স্পেকট্রামের একটি ওপেন কমান্ড ছিল এবং এটি LOAD থেকে সম্পূর্ণ পৃথক ছিল। এবং বোঝা শক্ত।
রডরিগো

3
প্রশ্নটি বন্ধ করার বিষয়েও আমি একমত নই, তবে আমি আপনার উত্তরটি সত্যিই পছন্দ করি।
এনজো ফারবার

23
যদিও আমি আমার প্রশ্নটি লিনাক্স / উইন্ডোজ ওএসকে সতেজ রাখার জন্য সীমাবদ্ধ রাখতে সম্পাদনা করেছি, এই উত্তরটি সম্পূর্ণ বৈধ এবং কার্যকর। আমার প্রশ্নে যেমন বলা হয়েছে, আমি কোনও কিছু বাস্তবায়ন করতে চাইছি না বা অন্য লোককে আমার কাজ করানোর চেষ্টা করব না, আমি তা শিখতে চাইছি। শিখতে আপনাকে অবশ্যই 'বড়' প্রশ্ন জিজ্ঞাসা করতে হবে। আমরা যদি খুব বেশি বিস্তৃত হওয়ার জন্য SO- এর উপর ক্রমাগত প্রশ্নগুলি বন্ধ করি তবে কী, কোথায় বা কেন কোনও ব্যাখ্যা না দিয়ে লোকেরা আপনার জন্য আপনার কোডটি লিখে রাখার জায়গা হওয়ার ঝুঁকিপূর্ণ। আমি বরং এটি শিখতে আসতে পারে এমন জায়গা হিসাবে রাখতাম।
8:30 এ জরাম্ম

14
এই উত্তরটি প্রমাণ করে মনে হচ্ছে যে প্রশ্নটি আপনার ব্যাখ্যাটি খুব বিস্তৃত নয়, বরং প্রশ্নটি নিজেই খুব বিস্তৃত।
jwg

17

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

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


6
এর আসল প্রশ্নের সাথে কী সম্পর্ক আছে?
বিল উড্ডার

1
আপনি লিনাক্সে কোনও ফাইল খুললে নিম্ন স্তরে কী ঘটে তা এটি বর্ণনা করে। আমি প্রশ্নটি বরং বিস্তৃত সম্মত, তাই এই জার্মাম উত্তরটি খুঁজছিল না may
অ্যালেক্স

1
সুতরাং আবার, অনুমতি জন্য কোন চেকিং?
বিল উড্ডার

11

বুককিপিং, বেশিরভাগ ক্ষেত্রে। এর মধ্যে "ফাইলটি কি বিদ্যমান?" এর মতো বিভিন্ন চেক অন্তর্ভুক্ত রয়েছে এবং "আমার কাছে কি এই ফাইলটি লেখার জন্য খোলার অনুমতি আছে?"

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

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

  • সিস্টেমটি বর্তমানে উন্মুক্ত সমস্ত ফাইলের উপর নজর রাখতে পারে এবং এগুলি মুছে ফেলা থেকে রোধ করতে পারে (উদাহরণস্বরূপ)।
  • আধুনিক ওএসগুলি হ্যান্ডলগুলির চারপাশে তৈরি করা হয় - হ্যান্ডলগুলি দিয়ে আপনি করতে পারেন এমন প্রচুর পরিমাণে দরকারী জিনিস রয়েছে এবং বিভিন্ন ধরণের হ্যান্ডলগুলি প্রায় একইরকম আচরণ করে। উদাহরণস্বরূপ, যখন একটি উইন্ডোজ ফাইল হ্যান্ডেলটিতে একটি অ্যাসিঙ্ক্রোনাস আই / ও অপারেশন সম্পূর্ণ হয়, হ্যান্ডেলটি সংকেত দেওয়া হয় - এটি আপনাকে সিগন্যাল হওয়া অবধি হ্যান্ডেলটিতে ব্লক করতে দেয় বা অ্যাসিঙ্ক্রোনালি পুরোপুরি অপারেশনটি সম্পন্ন করতে দেয়। কোনও ফাইল হ্যান্ডেলের অপেক্ষার সাথে থ্রেড হ্যান্ডেলের অপেক্ষার অনুরূপ (যেমন সূচিত হয় যখন থ্রেডটি শেষ হয়), একটি প্রক্রিয়া হ্যান্ডেল (আবার প্রক্রিয়া শেষ হওয়ার পরে সংকেতযুক্ত), বা একটি সকেট (যখন কিছু অ্যাসিনক্রোনাস অপারেশন সম্পূর্ণ হয়)। ঠিক তেমনি গুরুত্বপূর্ণ, হ্যান্ডলগুলি তাদের নিজ নিজ প্রক্রিয়াগুলির মালিকানাধীন, সুতরাং যখন কোনও প্রক্রিয়া অপ্রত্যাশিতভাবে শেষ হয় (বা অ্যাপ্লিকেশনটি খারাপভাবে লেখা হয়), ওএস জানে যে এটি হ্যান্ডলগুলি কীভাবে প্রকাশ করতে পারে।
  • বেশিরভাগ অপারেশন অবস্থানগত - আপনি readআপনার ফাইলের শেষ অবস্থান থেকে। কোনও ফাইলের নির্দিষ্ট "খোলার" শনাক্ত করার জন্য একটি হ্যান্ডেল ব্যবহার করে, আপনি একই ফাইলটিতে একযোগে একাধিক একযোগে হ্যান্ডলগুলি রাখতে পারেন, প্রতিটি নিজস্ব জায়গা থেকে পড়া। একটি উপায়ে, হ্যান্ডেলটি ফাইলের মধ্যে চলনযোগ্য উইন্ডো হিসাবে কাজ করে (এবং অ্যাসিঙ্ক্রোনাস আই / ও অনুরোধগুলি জারি করার উপায়, যা খুব সহজ) are
  • হ্যান্ডলগুলি ফাইলের নামের চেয়ে অনেক ছোট are একটি হ্যান্ডেল সাধারণত পয়েন্টারের আকার হয় সাধারণত 4 বা 8 বাইট। অন্যদিকে, ফাইলের নামগুলিতে কয়েকশো বাইট থাকতে পারে।
  • হ্যান্ডলগুলি ওএসগুলিকে ফাইলটি সরানোর অনুমতি দেয় , যদিও অ্যাপ্লিকেশনগুলি এটি খোলার পরেও রয়েছে - হ্যান্ডেলটি এখনও বৈধ এবং এটি এখনও একই ফাইলটিতে নির্দেশ করে, যদিও ফাইলের নাম পরিবর্তন হয়েছে।

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


7

এটা মূলে যখন পড়া কিছুই অভিনব আসলে জন্য খোলার দরকার ঘটতে। ফাইলটি বিদ্যমান রয়েছে তা যাচাই করা দরকার এবং অ্যাপ্লিকেশনটিতে এটি পড়ার পর্যাপ্ত অধিকার রয়েছে এবং আপনি একটি হ্যান্ডেল তৈরি করতে পারেন যার ভিত্তিতে আপনি ফাইলটিতে পঠন কমান্ড জারি করতে পারেন।

এটি সেই আদেশগুলিতে রয়েছে যে আসল পাঠ পাঠানো হবে।

হ্যান্ডেলের সাথে যুক্ত বাফারটি পূরণ করার জন্য ওএস প্রায়শই একটি পঠন অপারেশন শুরু করে পঠন শুরু করে। তারপরে আপনি যখন রিডটি করেন তখন তা বাফারের সামগ্রীগুলি তত্ক্ষণাত ফিরিয়ে আনতে পারে তবে তারপরে ডিস্ক আইওতে অপেক্ষা করতে হবে।

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


5

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

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

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


-7

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

ওপেন কমান্ডটি একটি সিস্টেম কল উত্পন্ন করবে যা পরিবর্তিতভাবে ফাইলের সামগ্রীগুলি মাধ্যমিক স্টোরেজ (হার্ড-ডিস্ক) থেকে প্রাথমিক স্টোরেজ (রাম) এ অনুলিপি করে।

এবং আমরা একটি ফাইল 'বন্ধ' করি কারণ ফাইলটির পরিবর্তিত সামগ্রীগুলি হার্ডডিস্কের মূল ফাইলে প্রতিফলিত করতে হয়। :)

আশা করি এইটি কাজ করবে.

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