উইকিপিডিয়ার তুলনায় ফাইল বর্ণনাকারীদের আরও সরল বর্ণনা কী হতে পারে? কেন তাদের প্রয়োজন হয়? বলুন, শেল প্রক্রিয়াগুলি উদাহরণ হিসাবে গ্রহণ করুন এবং এটি এর জন্য কীভাবে প্রযোজ্য?
কোনও প্রক্রিয়া সারণীতে একাধিক ফাইল ডেস্ক্রিপ্টর রয়েছে। যদি হ্যাঁ, কেন?
উইকিপিডিয়ার তুলনায় ফাইল বর্ণনাকারীদের আরও সরল বর্ণনা কী হতে পারে? কেন তাদের প্রয়োজন হয়? বলুন, শেল প্রক্রিয়াগুলি উদাহরণ হিসাবে গ্রহণ করুন এবং এটি এর জন্য কীভাবে প্রযোজ্য?
কোনও প্রক্রিয়া সারণীতে একাধিক ফাইল ডেস্ক্রিপ্টর রয়েছে। যদি হ্যাঁ, কেন?
উত্তর:
সহজ কথায়, আপনি যখন কোনও ফাইল খুলবেন, অপারেটিং সিস্টেম সেই ফাইলটি উপস্থাপন করতে এবং সেই খোলা ফাইলটির তথ্য সংরক্ষণ করার জন্য একটি এন্ট্রি তৈরি করে। সুতরাং আপনার ওএসে যদি 100 টি ফাইল খোলা থাকে তবে ওএসে 100 টি প্রবেশ (কার্নেলের কোথাও) থাকবে। এই এন্ট্রিগুলি (... 100, 101, 102 ....) এর মতো পূর্ণসংখ্যার দ্বারা প্রতিনিধিত্ব করা হয়। এই এন্ট্রি নম্বরটি ফাইল বর্ণনাকারী। সুতরাং এটি কেবলমাত্র একটি পূর্ণসংখ্যা নম্বর যা অপারেটিং সিস্টেমের মধ্যে একটি খোলা ফাইলটিকে অনন্যভাবে উপস্থাপন করে। যদি আপনার প্রক্রিয়া 10 টি ফাইল খোলে তবে আপনার প্রক্রিয়া সারণিতে ফাইল বর্ণনাকারীদের জন্য 10 টি প্রবেশ থাকবে।
একইভাবে আপনি যখন কোনও নেটওয়ার্ক সকেট খোলেন, তখন এটি একটি পূর্ণসংখ্যার দ্বারাও উপস্থাপিত হয় এবং এটিকে সকেট বিবরণী বলা হয়। আমি আশা করি তুমি বুঝতে পেরেছ.
/proc
সর্বদা স্টাফের জন্য খোল ।
open()
আপনাকে ফাইল বর্ণনাকারী 3 দেবে, এমনকি যদি অন্য চলমান প্রক্রিয়াতে কোনও ফাইল বর্ণনাকারী উপস্থিত থাকে 3.. এর পসিক্স সংজ্ঞাটিopen()
দেখুন : "উন্মুক্ত () ফাংশনটি নামকৃত ফাইলটির জন্য একটি ফাইল বর্ণনাকারী ফিরিয়ে দেবে যা সর্বনিম্ন ফাইল বিবরণকারী বর্তমানে সেই প্রক্রিয়াটির জন্য খোলা নেই " (সামনে জোর দাও).
একটি ফাইল বর্ণনাকারী একটি অস্বচ্ছ হ্যান্ডেল যা ফাইল / সকেট সংস্থান সনাক্ত করতে ব্যবহারকারী এবং কার্নেল স্পেসের মধ্যে ইন্টারফেসে ব্যবহৃত হয়। অতএব, আপনি যখন ব্যবহার করেন open()
বা socket()
(কার্নেলের সাথে ইন্টারফেসের জন্য সিস্টেম কল করে), আপনাকে একটি ফাইল বর্ণনাকারী দেওয়া হয়, এটি একটি পূর্ণসংখ্যা (এটি আসলে আপনার কাঠামোর প্রক্রিয়ায় সূচক হয় - তবে এটি গুরুত্বপূর্ণ নয়)। অতএব, আপনি কার্নেল সাথে সরাসরি ইন্টারফেসে, এর সিস্টেম কল ব্যবহার করতে চান তাহলে read()
, write()
, close()
ইত্যাদি হাতল আপনি ব্যবহার একটি ফাইল বর্ণনাকারী হয়।
সিস্টেম কলগুলিতে বিমূর্ততার একটি স্তর রয়েছে যা stdio
ইন্টারফেস। এটি বেসিক সিস্টেম কলগুলির চেয়ে বেশি কার্যকারিতা / বৈশিষ্ট্য সরবরাহ করে। এই ইন্টারফেসের জন্য, আপনার অস্বচ্ছ হ্যান্ডেলটি হ'ল এটি FILE*
, যা fopen()
কল দিয়ে ফিরে আসে । অনেক অনেক ফাংশন ব্যবহার আছে stdio
ইন্টারফেস fprintf()
, fscanf()
, fclose()
, আপনার জীবন সহজ করতে যা। সি, stdin
, stdout
, এবং stderr
হয় FILE*
, ইউনিক্স যথাক্রমে ফাইল বর্ণনাকারী ম্যাপ যা 0
, 1
এবং 2
।
এটি ঘোড়ার মুখ থেকে শুনুন: এপিইউ (রিচার্ড স্টিভেনস)।
কার্নেলের কাছে, সমস্ত খোলা ফাইলগুলি ফাইল বর্ণনাকারী দ্বারা উল্লেখ করা হয়। একটি ফাইল বর্ণনাকারী একটি অ-নেতিবাচক সংখ্যা।
যখন আমরা একটি বিদ্যমান ফাইল খুলি বা একটি নতুন ফাইল তৈরি করি, কার্নেল প্রক্রিয়াটিতে একটি ফাইল বর্ণনাকারীকে ফিরিয়ে দেয়। কার্নেল সমস্ত উন্মুক্ত ফাইল বর্ণনাকারীর একটি সারণী রক্ষণাবেক্ষণ করে যা ব্যবহৃত হয়। ফাইল বর্ণনাকারীদের বরাদ্দ সাধারণত ক্রমযুক্ত এবং এগুলি ফ্রি ফাইল বর্ণনাকারীদের পুল থেকে পরবর্তী ফ্রি ফাইল বর্ণনাকারী হিসাবে ফাইলটিতে বরাদ্দ করা হয়। আমরা যখন ফাইলটি বন্ধ করি তখন ফাইল বর্ণনাকারী মুক্ত হয় এবং আরও বরাদ্দের জন্য উপলব্ধ।
আরও বিশদে এই চিত্রটি দেখুন:
আমরা যখন কোনও ফাইল পড়তে বা লিখতে চাই তখন আমরা ফাইল বর্ণনাকারীর সাহায্যে ফাইলটি সনাক্ত করি যা খোলা () বা ফাংশন কল () দ্বারা ফিরে আসে এবং এটি () বা লেখার জন্য () পড়ার পক্ষে যুক্তি হিসাবে ব্যবহার করি ।
এটি কনভেনশন দ্বারা, ইউনিক্স সিস্টেম শেলগুলি একটি প্রক্রিয়াটির স্ট্যান্ডার্ড ইনপুট সহ ফাইল বর্ণনাকারী 0 , স্ট্যান্ডার্ড আউটপুট সহ ফাইল বর্ণনাকারী 1 এবং স্ট্যান্ডার্ড ত্রুটির সাথে ফাইল বিবরণী 2 সংযুক্ত করে ।
ফাইল বর্ণনাকারী 0 থেকে OPEN_MAX অবধি। ফাইল বিবরণকারী সর্বাধিক মান সঙ্গে প্রাপ্ত করা যেতে পারে ulimit -n
। আরও তথ্যের জন্য, এপিইউ বইয়ের তৃতীয় অধ্যায়টি পড়ুন।
osqueryi <<< echo '.all process_open_files'
ব্যাশ শেলের মধ্যে চালিত করুন ।
অন্যান্য উত্তরে দুর্দান্ত জিনিস যুক্ত করা হয়েছে। আমি আমার 2 সেন্ট যোগ করব।
উইকিপিডিয়া অনুসারে আমরা নিশ্চিতভাবে জানি: একটি ফাইল বর্ণনাকারী একটি অ-নেতিবাচক পূর্ণসংখ্যা। আমার মনে হচ্ছে সবচেয়ে গুরুত্বপূর্ণ যেটি অনুপস্থিত তা হ'ল:
ফাইল বর্ণনাকারী একটি প্রক্রিয়া আইডিতে আবদ্ধ।
আমরা জানি যে সর্বাধিক বিখ্যাত ফাইল বর্ণনাকারী 0, 1 এবং 2 হয় 0 0 এর সাথে সামঞ্জস্য হয় STDIN
, 1 থেকে STDOUT
এবং 2 থেকে 2 STDERR
।
বলুন, শেল প্রক্রিয়াগুলি উদাহরণ হিসাবে গ্রহণ করুন এবং এটি এর জন্য কীভাবে প্রযোজ্য?
এই কোডটি দেখুন
#>sleep 1000 &
[12] 14726
আমরা 14726 (পিআইডি) আইডি দিয়ে একটি প্রক্রিয়া তৈরি করেছি। ব্যবহার করে lsof -p 14726
আমরা এই জাতীয় জিনিস পেতে পারি:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sleep 14726 root cwd DIR 8,1 4096 1201140 /home/x
sleep 14726 root rtd DIR 8,1 4096 2 /
sleep 14726 root txt REG 8,1 35000 786587 /bin/sleep
sleep 14726 root mem REG 8,1 11864720 1186503 /usr/lib/locale/locale-archive
sleep 14726 root mem REG 8,1 2030544 137184 /lib/x86_64-linux-gnu/libc-2.27.so
sleep 14726 root mem REG 8,1 170960 137156 /lib/x86_64-linux-gnu/ld-2.27.so
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
চতুর্থতম কলাম এফডি এবং তার পরের কলাম টিওয়াইপি ফাইল বর্ণনাকারী এবং ফাইল বর্ণনাকারী টাইপের সাথে সমান।
এফডির জন্য কয়েকটি মান হতে পারে:
cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device
তবে আসল ফাইল বর্ণনাকারী এর অধীনে রয়েছে:
NUMBER – Represent the actual file descriptor.
সংখ্যার পরে অক্ষর অর্থাৎ "1u", ফাইলটি যে মোডে খোলা থাকে তা উপস্থাপন করে। পড়ার জন্য r, লেখার জন্য ডাব্লু, আপনি পড়তে এবং লেখার জন্য
টিওয়াইপি ফাইলের ধরণ নির্দিষ্ট করে। টিওয়াইপি এর মানগুলির মধ্যে কয়েকটি:
REG – Regular File
DIR – Directory
FIFO – First In First Out
তবে সমস্ত ফাইল বর্ণনাকারী হলেন সিএইচআর - চরিত্রের বিশেষ ফাইল (বা অক্ষর ডিভাইস ফাইল)
এখন আমরা জন্য ফাইল বর্ণনাকারী চিহ্নিত করতে পারেন STDIN
, STDOUT
এবং STDERR
সঙ্গে সহজ lsof -p PID
, অথবা আমরা একই যদি আমরা দেখতে পারি ls /proc/PID/fd
।
নোটটি যে ফাইল বর্ণনাকারী সারণীর ট্র্যাক রাখে তা ফাইল টেবিল বা আইনোড সারণির মতো নয় Note এগুলি পৃথক, যেমন কিছু অন্যান্য উত্তর ব্যাখ্যা করেছে।
আপনি নিজেকে জিজ্ঞাসা করতে পারেন শারীরিকভাবে এই ফাইল বর্ণনাকারী কোথায় এবং /dev/pts/6
উদাহরণস্বরূপ কী সঞ্চিত আছে
sleep 14726 root 0u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 1u CHR 136,6 0t0 9 /dev/pts/6
sleep 14726 root 2u CHR 136,6 0t0 9 /dev/pts/6
ঠিক আছে, /dev/pts/6
খাঁটি স্মৃতিতে বেঁচে থাকে। এগুলি নিয়মিত ফাইল নয়, তথাকথিত অক্ষরযুক্ত ডিভাইস ফাইল । আপনি এটি দিয়ে এটি পরীক্ষা করতে পারেন: ls -l /dev/pts/6
এবং তারা c
আমার ক্ষেত্রে শুরু করবে crw--w----
।
ওএস যেমন সর্বাধিক লিনাক্সকে স্মরণ করতে সাত ধরণের ফাইল সংজ্ঞায়িত করে:
সম্পর্কিত আরও পয়েন্ট File Descriptor
:
File Descriptors
(এফডি) হ'ল (0, 1, 2, ...)
ফাইলগুলির সাথে সম্পর্কিত নন-নেগেটিভ পূর্ণসংখ্যা ।
0, 1, 2
প্রমাণ এফডি 'থেকে যে অনুরূপ গুলি STDIN_FILENO
, STDOUT_FILENO
এবং STDERR_FILENO
(সংজ্ঞায়িত unistd.h
) শেল যখন প্রোগ্রাম আরম্ভ পক্ষে ডিফল্টরূপে খুলে দিয়েছিল।
সিক্যুয়াল অর্ডারে এফডি বরাদ্দ করা হয়, যার অর্থ সর্বনিম্ন সম্ভাব্য অব্যবহৃত পূর্ণসংখ্যার মান।
কোনও নির্দিষ্ট প্রক্রিয়ার জন্য এফডি এর /proc/$pid/fd
(ইউনিক্স ভিত্তিক সিস্টেমে) দেখা যায় ।
অন্যান্য উত্তরের সংযোজন হিসাবে, ইউনিক্স সবকিছুকে একটি ফাইল সিস্টেম হিসাবে বিবেচনা করে। আপনার কীবোর্ড এমন একটি ফাইল যা কেবল কার্নেলের দৃষ্টিকোণ থেকে পঠিত হয়। স্ক্রিনটি কেবল একটি লেখার ফাইল। একইভাবে, ফোল্ডার, ইনপুট-আউটপুট ডিভাইস ইত্যাদিও ফাইল হিসাবে বিবেচিত হয়। যখনই কোনও ফাইল খোলা থাকে, যখন ডিভাইস ড্রাইভাররা [ডিভাইস ফাইলগুলির জন্য] একটি খোলার অনুরোধ জানায় (), বা কোনও প্রক্রিয়া কোনও ব্যবহারকারী ফাইল খুললে কার্নেল একটি ফাইল বর্ণনাকারী বরাদ্দ করে, এমন একটি পূর্ণসংখ্যা যা কেবলমাত্র সেগুলি পড়ার জন্য এই ফাইলটির অ্যাক্সেস নির্দিষ্ট করে inte , কেবল লিখুন ইত্যাদি reference [রেফারেন্সের জন্য: https://en.wikedia.org/wiki/ সব কিছুই_আইস_এ_ফাইল ]
ফাইল বর্ণনাকারী (এফডি):
s ls mydir 2> त्रुटीfile.txt
স্ট্যান্ডার্ড ত্রুটির ফাইল ডেস্ক্রিপ্টর ২ টি।
যদি মাইডির নামে কোনও ডিরেক্টরি না থাকে তবে কমান্ডের আউটপুট ফাইল
ত্রুটি-রক্ষিত হবে। "2>" ব্যবহার করে আমরা ত্রুটি আউটপুটটিকে "ত্রুটি ফাইল" নামে পুনরায় নির্দেশ করি। txt "
সুতরাং, প্রোগ্রাম আউটপুট ত্রুটি দিয়ে বিশৃঙ্খলা হয় না।
আমি আপনার উত্তর পেয়েছি আশা করি।
যে কোনও অপারেটিং সিস্টেমে প্রসেস (পি এর) চলছে, বলুন পি 1, পি 2, পি 3 এবং আরও বলুন। প্রতিটি প্রক্রিয়া সাধারণত ফাইলগুলির একটি চলমান ব্যবহার করে।
প্রতিটি প্রক্রিয়া একটি প্রক্রিয়া গাছ (বা একটি প্রক্রিয়া টেবিল, অন্য ফ্রেসিংয়ে থাকে) নিয়ে গঠিত।
সাধারণত, অপারেটিং সিস্টেমগুলি প্রতিটি প্রক্রিয়াতে প্রতিটি ফাইলকে একটি সংখ্যার দ্বারা প্রতিনিধিত্ব করে (যা প্রতিটি প্রক্রিয়া গাছ / সারণীতে বলা হয়)।
প্রথম প্রক্রিয়ায় ব্যবহৃত ফাইল file0 , দ্বিতীয় file1 , তৃতীয় file2 , এবং তাই ঘোষণা।
এ জাতীয় যে কোনও সংখ্যা ফাইল বিবরণকারী des
ফাইল বর্ণনাকারীরা সাধারণত পূর্ণসংখ্যা হয় (0, 1, 2 এবং 0.5, 1.5, 2.5 নয়)।
প্রদত্ত আমরা প্রায়শই প্রসেসগুলি "প্রক্রিয়া-সারণী" হিসাবে বর্ণনা করি এবং এই সারণিতে সারি রয়েছে (এন্ট্রি) আমরা বলতে পারি যে প্রতিটি এন্ট্রিতে ফাইল বর্ণনাকারী সেল পুরো প্রবেশকে উপস্থাপন করতে ব্যবহার করে।
একইভাবে, আপনি যখন কোনও নেটওয়ার্ক সকেট খুলেন, তখন এটিতে সকেট বর্ণনাকারী থাকে।
কিছু অপারেটিং সিস্টেমে আপনি ফাইল বর্ণনাকারীর বাইরে চলে যেতে পারেন, তবে এই জাতীয় পরিস্থিতি খুব বিরল, এবং গড় কম্পিউটার ব্যবহারকারীকে এ থেকে উদ্বিগ্ন হওয়া উচিত নয়।
ফাইল বর্ণনাকারীরা বিশ্বব্যাপী হতে পারে (প্রক্রিয়া এ 0 বলার আগে শুরু হয় এবং 1 এ শেষ হয়; প্রসেস বি 2 তে বলে শুরু হয় এবং 3 এ শেষ হয়) এবং এর আগেও, তবে যতদূর আমি জানি, সাধারণত আধুনিক অপারেটিং সিস্টেমে ফাইল বর্ণনাকারী বিশ্বব্যাপী নয়, এবং প্রকৃতপক্ষে প্রক্রিয়া-নির্দিষ্ট (প্রক্রিয়া এ 0 বলে শুরু হয় এবং 5 এ শেষ হয়, যখন প্রক্রিয়া বি 0 তে শুরু হয় এবং 10 এ শেষ হয়)।
সরলিকৃত সমস্ত প্রতিক্রিয়ার উপরে যোগ করুন।
আপনি যদি ব্যাশ স্ক্রিপ্টে ফাইলগুলির সাথে কাজ করছেন তবে ফাইল বিবরণী ব্যবহার করা আরও ভাল।
উদাহরণস্বরূপ: -
আপনি "test.txt" ফাইলটি / পড়তে এবং লিখতে চান।
নীচের শো হিসাবে ফাইল বিবরণকারী ব্যবহার করুন
FILE=$1 # give the name of file in the command line
exec 5<>$FILE # '5' here act as the file descriptor
# Reading from the file line by line using file descriptor
while read LINE; do
echo "$LINE"
done <&5
# Writing to the file using descriptor
echo "Adding the date: `date`" >&5
exec 5<&- # Closing a file descriptor