फ़ाइल विवरण क्या हैं, सरल शब्दों में समझाया गया है?


383
  1. विकिपीडिया की तुलना में फाइल डिस्क्रिप्टर का अधिक सरलीकृत वर्णन क्या होगा? उनकी आवश्यकता क्यों है? कहो, शेल प्रक्रियाओं को एक उदाहरण के रूप में लें और यह इसके लिए कैसे लागू होता है?

  2. क्या एक प्रक्रिया तालिका में एक से अधिक फ़ाइल विवरणक होते हैं। यदि हाँ, तो क्यों?


3
स्टड स्काउट stderr आदि की अवधारणाओं के बारे में क्या? मेरे पास एक उदाहरण है जैसे ब्राउज़र प्रक्रिया खोली गई और इसने मेरे html को प्रदर्शित करने के लिए कुछ अस्थायी फाइलें खोली हैं। प्रक्रिया पढ़ने / लिखने के लिए उसी fd का उपयोग करती है? इसके अलावा प्रक्रिया तालिका ....... इसमें fd0 पॉइंटर fd1 पॉइंटर fd2 पॉइंटर जैसी प्रविष्टियां हैं ..... इसका मतलब है कि ये सभी फाइलें RAM में हैं? और क्यों इशारा करते हैं?
निशांत

43
जब आप कोई फ़ाइल खोलते हैं, तो OS उस फ़ाइल में एक स्ट्रीम बनाता है और उस स्ट्रीम को ओपन फाइल से कनेक्ट करता है, वास्तव में डिस्क्रिप्टर उस स्ट्रीम का प्रतिनिधित्व करता है। इसी तरह ओएस द्वारा बनाई गई कुछ डिफ़ॉल्ट धाराएँ हैं। ये स्ट्रीम फ़ाइलों के बजाय आपके टर्मिनल से जुड़ी हैं। इसलिए जब आप टर्मिनल में कुछ लिखते हैं तो यह स्टडिन स्ट्रीम और OS में जाता है। और जब आप टर्मिनल पर "एलएस" कमांड लिखते हैं, तो ओएस आउटपुट को स्ट्रीम स्ट्रीम में लिखता है। stdout स्ट्रीम आपके मॉनिटर टर्मिनल से जुड़ी होती है ताकि आप वहां आउटपुट देख सकें।
तैयब

1
ब्राउज़र उदाहरण के बारे में, यह आवश्यक नहीं है कि ब्राउज़र फ़ाइलों को खोल कर रखे। यह ब्राउज़र के कार्यान्वयन पर निर्भर करता है लेकिन ज्यादातर मामलों में ब्राउज़र एक अस्थायी फ़ाइल खोलते हैं, फ़ाइल लिखते हैं, और फ़ाइल को बंद करते हैं, इसलिए यह आवश्यक नहीं है कि वेब पेज खुला होने पर भी फ़ाइल खोली जाए। और डिस्क्रिप्टर केवल फ़ाइल की जानकारी रखता है और आवश्यक रूप से फ़ाइल को रैम में नहीं रखता है। जब आप किसी डिस्क्रिप्टर से डेटा पढ़ते हैं, तो ओएस हार्ड-डिस्क से डेटा पढ़ता है। फ़ाइल डिस्क्रिप्टर में जानकारी हार्ड-डिस्क आदि पर फ़ाइल के स्थान का प्रतिनिधित्व करती है ..
तय्यब

5
फाइल डिस्क्रिप्टर से फाइल करना एक से एक मैपिंग नहीं है। मैं एक ही फाइल को 4 बार () खोल सकता था और 4 अलग फाइल डिस्क्रिप्टर प्राप्त कर सकता था। जिनमें से प्रत्येक को पढ़ने, लिखने या दोनों के लिए (खुले में पारित किए गए झंडे के आधार पर) इस्तेमाल किया जा सकता है। जहाँ तक कि फ़ाइल RAM में या डिस्क पर रहती है - यह आपसे कर्नेल और उसके विभिन्न कैश द्वारा छिपाया गया है। अंततः कैश क्या है जो डिस्क पर (लिखने के लिए) से मेल खाएगा, और कर्नेल डिस्क पर वापस नहीं जाएगा, पढ़ने के लिए, यदि डेटा पहले से कैश में है।
बीनो

7
यह आसानी से इसे समझने के लिए एक अच्छा लेख है bottomupcs.com/file_descriptors.xhtml
कृष्ण गोपाल

जवाबों:


561

सरल शब्दों में, जब आप किसी फ़ाइल को खोलते हैं, तो ऑपरेटिंग सिस्टम उस फ़ाइल का प्रतिनिधित्व करने के लिए एक प्रविष्टि बनाता है और उस फ़ाइल के बारे में जानकारी संग्रहीत करता है। इसलिए यदि आपके OS में 100 फाइलें खोली गई हैं तो OS में 100 प्रविष्टियां होंगी (कहीं न कहीं कर्नेल में)। इन प्रविष्टियों को पूर्णांक जैसे (... 100, 101, 102 ....) द्वारा दर्शाया जाता है। यह एंट्री नंबर फाइल डिस्क्रिप्टर है। तो यह सिर्फ एक पूर्णांक संख्या है जो विशिष्ट रूप से ऑपरेटिंग सिस्टम में एक खुली हुई फ़ाइल का प्रतिनिधित्व करता है। यदि आपकी प्रक्रिया 10 फाइलें खोलती है, तो आपके प्रोसेस टेबल में फाइल डिस्क्रिप्टर के लिए 10 प्रविष्टियां होंगी।

इसी तरह जब आप एक नेटवर्क सॉकेट खोलते हैं, तो इसे एक पूर्णांक द्वारा भी दर्शाया जाता है और इसे सॉकेट डिस्क्रिप्टर कहा जाता है। मुझे आशा है की तुम समझ गए होगे।


7
इसके अलावा, यही कारण है कि यदि आप एक साथ बहुत सारी फाइलें खोलते हैं, तो आप फ़ाइल डिस्क्रिप्टर से बाहर भाग सकते हैं। जो * nix सिस्टम को चलने से रोकेगा, क्योंकि वे /procसभी समय में सामान को खोलने के लिए डिस्क्रिप्टर खोलते हैं ।
स्पेंसर रथबून

8
@ErbenMo: नहीं यह समान नहीं हो सकता है। जब आप फ़ाइल खोलते हैं, तो ऑपरेटिंग सिस्टम एक FD प्रदान करेगा जो उपलब्ध है और जब आप इसे बंद करते हैं तो OS FD को रिलीज़ करता है और उसके बाद खोली गई FD को किसी अन्य फ़ाइल में असाइन कर सकता है। इसका ऑपरेटिंग सिस्टम ओपन फाइल्स को ट्रैक करने का तरीका है और इसका किसी खास फाइल से कोई लेना-देना नहीं है।
तैयब

49
" तो यह सिर्फ एक पूर्णांक संख्या है जो विशिष्ट रूप से ऑपरेटिंग सिस्टम में एक खुली हुई फ़ाइल का प्रतिनिधित्व करता है। " यह गलत है। पूर्णांक विशिष्ट रूप से एक प्रक्रिया के भीतर एक खुली हुई फ़ाइल का प्रतिनिधित्व करता है । उदाहरण के लिए, फ़ाइल डिस्क्रिप्टर 0, एक प्रक्रिया में एक खोली गई फ़ाइल का प्रतिनिधित्व करेगा और दूसरी प्रक्रिया में पूरी तरह से अलग फ़ाइल खोली जाएगी।
कीथ थॉम्पसन

15
@Tayyab: मेरा मानना ​​है कि आप गलत हैं। फ़ाइल डिस्क्रिप्टर 0, 1, और 2 प्रत्येक चल रही प्रक्रिया के लिए मानक इनपुट, मानक आउटपुट और मानक त्रुटि हैं। एक सफल प्रारंभिक कॉल open()आपको फ़ाइल डिस्क्रिप्टर 3 दे सकती है, भले ही एक और चल रही प्रक्रिया में एक फ़ाइल डिस्क्रिप्टर हो। 3. POSIX परिभाषाopen() देखें : "खुला () फ़ंक्शन नामांकित फ़ाइल के लिए एक फ़ाइल डिस्क्रिप्टर लौटाएगा जो सबसे कम है। फाइल डिस्क्रिप्टर वर्तमान में उस प्रक्रिया के लिए खुला नहीं है । " (महत्व दिया)।
कीथ थॉम्पसन

17
@KeithThompson: हां आप सही हैं। वास्तव में यह अमूर्त के स्तर के बारे में है। वास्तव में दो तालिकाओं को बनाए रखा जाता है, जहां पहली प्रति-प्रक्रिया है और दूसरी प्रणाली विस्तृत है। प्रति-प्रक्रिया तालिका (यानी fdtable) में एफडी अद्वितीय प्रणाली चौड़ा नहीं है। हालाँकि यह वी-नोड टेबल पर मैप करता है जिसमें सिस्टम वाइड यूनिक एंट्रीज होती हैं। इसलिए जब आप डिस्क्रिप्टर की जांच करने के लिए फोपेन () और फ़ेलनो () फ़ंक्शन को कॉल करते हैं तो आप 2 अलग-अलग प्रक्रियाओं में एक ही एफडी नंबर प्राप्त कर सकते हैं क्योंकि यह fdtable का इंडेक्स देता है जो प्रति-प्रक्रिया है। इसे लाने के लिए धन्यवाद!!
तैय्यब

116

एक फाइल डिस्क्रिप्टर एक अपारदर्शी हैंडल है जो कि फाइल / सॉकेट संसाधनों की पहचान करने के लिए यूजर और कर्नेल स्पेस के बीच इंटरफेस में उपयोग किया जाता है। इसलिए, जब आप उपयोग करते हैं open()या socket()(कर्नेल के लिए सिस्टम कॉल इंटरफ़ेस), आपको एक फ़ाइल विवरणक दिया जाता है, जो एक पूर्णांक है (यह वास्तव में यू संरचना में एक सूचकांक है - लेकिन यह महत्वपूर्ण नहीं है)। इसलिए, आप कर्नेल के साथ सीधे इंटरफेस करने, करने के लिए सिस्टम कॉल का उपयोग करना चाहते हैं read(), write(), close()आदि संभाल आप का उपयोग एक फ़ाइल जानकारी देता है।

सिस्टम कॉल पर अमूर्त ओवरलेड की एक परत होती है, जो stdioइंटरफ़ेस है। यह बुनियादी प्रणाली कॉलों की तुलना में अधिक कार्यक्षमता / सुविधाएँ प्रदान करता है। इस इंटरफ़ेस के लिए, आपको मिलने वाला अपारदर्शी हैंडल एक है FILE*, जिसे fopen()कॉल द्वारा लौटाया जाता है । कई कई कार्यों का उपयोग कर रहे हैं stdioइंटरफेस fprintf(), fscanf(), fclose(), आपकी जीवन को आसान बनाने के लिए कर रहे हैं। सी में stdin,, stdoutऔर stderrहैं FILE*, जो कि UNIX में क्रमशः वर्णनकर्ता को फ़ाइल करने के लिए मैप करते हैं 0, 1और 2


6
मैं व्यक्तिगत रूप से सोचता हूं कि यह जवाब के रूप में चिह्नित एक से बेहतर है। Upvoted।
तारिक

101

इसे हॉर्स माउथ से सुनें: APUE (रिचर्ड स्टीवंस)।
कर्नेल के लिए, सभी ओपन फाइल को फाइल डेस्क्रिप्टर्स द्वारा संदर्भित किया जाता है। एक फ़ाइल विवरणक एक गैर-नकारात्मक संख्या है।

जब हम एक मौजूदा फ़ाइल खोलते हैं या एक नई फ़ाइल बनाते हैं, तो कर्नेल प्रक्रिया के लिए एक फ़ाइल विवरणक लौटाता है। कर्नेल सभी ओपन फ़ाइल डिस्क्रिप्टर की एक तालिका रखता है, जो उपयोग में हैं। फ़ाइल डिस्क्रिप्टर का आवंटन आम तौर पर अनुक्रमिक होता है और उन्हें फ़्री फ़ाइल डिस्क्रिप्टर के पूल से अगले फ़्री फ़ाइल डिस्क्रिप्टर के रूप में फ़ाइल को आवंटित किया जाता है। जब हम फाइल को बंद करते हैं, तो फाइल डिस्क्रिप्टर मुक्त हो जाता है और आगे आवंटन के लिए उपलब्ध होता है।
अधिक विवरण के लिए यह चित्र देखें:

दो प्रक्रिया

जब हम किसी फ़ाइल को पढ़ना या लिखना चाहते हैं, तो हम उस फ़ाइल डिस्क्रिप्टर के साथ फ़ाइल की पहचान करते हैं जिसे ओपन () या क्रिएट () फंक्शन कॉल द्वारा लौटाया गया था , और इसे पढ़ने () या लिखने () के तर्क के रूप में उपयोग करें ।
यह कन्वेंशन द्वारा है कि, UNIX सिस्टम शेल डिस्क्रिप्टर 0 को एक प्रक्रिया के स्टैंडर्ड इनपुट के साथ , फाइल डिस्क्रिप्टर 1 को स्टैंडर्ड आउटपुट के साथ और डिस्क्रिप्टर 2 को स्टैंडर्ड एरर के साथ जोड़ देता है ।
फ़ाइल डिस्क्रिप्टर 0 से OPEN_MAX तक होता है। फ़ाइल डिस्क्रिप्टर अधिकतम मूल्य के साथ प्राप्त किया जा सकता है ulimit -n। अधिक जानकारी के लिए, APUE बुक के 3 अध्याय से गुजरें।


1
चूंकि 0, 1, 2 एक प्रक्रिया के "स्टडिन", "स्टडआउट" और "स्टैडर" से जुड़े हैं, क्या हम विभिन्न प्रक्रियाओं के लिए एक ही समय में उन डिस्क्रिप्टर का उपयोग कर सकते हैं?
तारिक

@ तारिक: फाइल डिस्क्रिप्टर प्रति प्रक्रिया है। इसे देखने के लिए, ऑस्करी डाउनलोड करें और osqueryi <<< echo '.all process_open_files'बैश शेल में निष्पादित करें ।
बेन क्रेसी

29

अन्य उत्तरों में बढ़िया चीजें शामिल हैं। मैं सिर्फ अपने 2 सेंट जोड़ूंगा।

विकिपीडिया के अनुसार हम निश्चित रूप से जानते हैं: एक फाइल डिस्क्रिप्टर एक गैर-नकारात्मक पूर्णांक है। मुझे लगता है कि सबसे महत्वपूर्ण बात याद आ रही है:

फ़ाइल डिस्क्रिप्टर एक प्रोसेस आईडी से बंधे हैं।

हम जानते हैं कि सबसे प्रसिद्ध फाइल डिस्क्रिप्टर 0, 1 और 2 हैं। 0 STDIN, 1 STDOUT, टू , और 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

4-वें कॉलम की FD और बहुत अगला कॉलम TYPE, फाइल डिस्क्रिप्टर और फाइल डिस्क्रिप्टर टाइप के अनुरूप है।

एफडी के लिए कुछ मूल्य हो सकते हैं:

cwd – Current Working Directory
txt – Text file
mem – Memory mapped file
mmap – Memory mapped device

लेकिन वास्तविक फ़ाइल विवरणक निम्नानुसार है:

NUMBER – Represent the actual file descriptor. 

संख्या के बाद का चरित्र "1u", उस मोड का प्रतिनिधित्व करता है जिसमें फ़ाइल खोली जाती है। पढ़ने के लिए r, लिखने के लिए w, पढ़ने और लिखने के लिए यू।

टाइप फ़ाइल के प्रकार को निर्दिष्ट करता है। TYPE के कुछ मान इस प्रकार हैं:

REG – Regular File
DIR – Directory
FIFO – First In First Out

लेकिन सभी फाइल डिस्क्रिप्टर सीएचआर हैं - कैरेक्टर स्पेशल फाइल (या कैरेक्टर डिवाइस फाइल)

अब, हम फ़ाइल डिस्क्रिप्टर्स की पहचान कर सकते हैं STDIN, STDOUTऔर STDERRआसान के साथ lsof -p PID, या हम देख सकते हैं यदि हम ls /proc/PID/fd

ध्यान दें कि फ़ाइल डिस्क्रिप्टर तालिका जो कर्नेल को ट्रैक करती है, वह फ़ाइल टेबल या इनसाइड टेबल के समान नहीं है। ये अलग हैं, जैसा कि कुछ अन्य जवाबों में समझाया गया है।

एफडी टेबल

आप अपने आप से पूछ सकते हैं कि ये फ़ाइल वर्णनकर्ता भौतिक रूप से कहां हैं और /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----

बस सबसे लिनक्स को याद करने के लिए जैसे ओएस सात प्रकार की फाइलों को परिभाषित करता है:

  • नियमित फाइलें
  • निर्देशिकाएँ
  • चरित्र डिवाइस फ़ाइलें
  • डिवाइस फ़ाइलों को ब्लॉक करें
  • स्थानीय डोमेन सॉकेट
  • नामित पाइप (FIFOs) और
  • प्रतीकात्मक लिंक

1
धन्यवाद। वास्तव में यह इंगित करना महत्वपूर्ण है कि यह प्रति प्रक्रिया है! यह चीजों को बेहतर ढंग से देखने में मदद करता है।
निशांत

1
OS द्वारा परिभाषित फ़ाइलों के प्रकार, जिनका आपने उत्तर दिया है, वास्तव में फाइलों को निचले स्तर पर समझने में मदद करते हैं।
रोहन भले

20

अधिक अंक के बारे में File Descriptor:

  1. File Descriptors(एफडी) गैर-नकारात्मक पूर्णांक हैं (0, 1, 2, ...)जो कि खोली गई फ़ाइलों से जुड़े हैं।

  2. 0, 1, 2मानक हैं एफडी 'के लिए कि मेल खाती है STDIN_FILENO, STDOUT_FILENOऔर STDERR_FILENO(के रूप में परिभाषित unistd.h) खोल जब कार्यक्रम शुरू होता है की ओर से डिफ़ॉल्ट रूप से खोला गया।

  3. एफडी को अनुक्रमिक क्रम में आवंटित किया जाता है, जिसका अर्थ है न्यूनतम संभव असंबद्ध पूर्णांक मूल्य।

  4. एफडी की एक विशेष प्रक्रिया के लिए /proc/$pid/fd(यूनिक्स आधारित प्रणालियों पर) देखा जा सकता है ।


16

अन्य उत्तरों के अतिरिक्त, यूनिक्स सब कुछ एक फाइल सिस्टम के रूप में मानता है। आपका कीबोर्ड एक फ़ाइल है जिसे केवल कर्नेल के परिप्रेक्ष्य से पढ़ा जाता है। स्क्रीन एक लेखन केवल फ़ाइल है। इसी तरह, फ़ोल्डर्स, इनपुट-आउटपुट डिवाइस आदि को भी फाइल माना जाता है। जब भी कोई फ़ाइल खोली जाती है, तो कहें कि डिवाइस ड्राइवर [डिवाइस फ़ाइलों के लिए] एक ओपन () का अनुरोध करता है, या एक प्रक्रिया एक उपयोगकर्ता फ़ाइल को खोलता है कर्नेल एक फ़ाइल डिस्क्रिप्टर आवंटित करता है, एक पूर्णांक जो उस फ़ाइल तक पहुंच को निर्दिष्ट करता है जैसे कि यह केवल पढ़ा जा रहा है , केवल आदि लिखें [संदर्भ के लिए: https://en.wikipedia.org/wiki/Everything_is_a_file ]


फ़ाइल डिस्क्रिप्टर उन चीज़ों को भी संदर्भित कर सकते हैं जो फ़ाइल सिस्टम में मौजूद नहीं हैं, जैसे अनाम पाइप और नेटवर्क सॉकेट।
kbolino

12

फाइल डिस्क्रिप्टर्स (एफडी):

  • में लिनक्स / यूनिक्स , सब कुछ एक फाइल है। नियमित फ़ाइल, निर्देशिकाएं, और यहां तक ​​कि डिवाइस भी फ़ाइलें हैं। हर फाइल में एक संबद्ध संख्या होती है जिसे फाइल डिस्क्रिप्टिव (एफडी) कहा जाता है।
  • आपकी स्क्रीन में एक फाइल डिस्क्रिप्टर भी है। जब किसी प्रोग्राम को निष्पादित किया जाता है, तो आउटपुट को स्क्रीन के फ़ाइल डिस्क्रिप्टर को भेजा जाता है, और आप अपने मॉनिटर पर प्रोग्राम आउटपुट देखते हैं। यदि आउटपुट को प्रिंटर के फ़ाइल डिस्क्रिप्टर में भेजा जाता है, तो प्रोग्राम आउटपुट प्रिंट हो जाता।

    त्रुटि पुनर्निर्देशन:
    जब भी आप टर्मिनल पर किसी प्रोग्राम / कमांड को निष्पादित करते हैं, तो 3 फाइलें हमेशा खुली रहती हैं
    1. मानक इनपुट
    2. मानक उत्पादन
    3. मानक त्रुटि।

    जब भी कोई प्रोग्राम चलाया जाता है तो ये फाइलें हमेशा मौजूद रहती हैं। जैसा कि फ़ाइल डिस्क्रिप्टर से पहले समझाया गया है, इन फ़ाइलों में से प्रत्येक के साथ जुड़ा हुआ है।
    फ़ाइल                                        फ़ाइल डिस्क्रिप्टर
    स्टैंडर्ड इनपुट STDIN 0
    स्टैंडर्ड आउटपुट STDOUT 1
    मानक त्रुटि STDERR 2

  • उदाहरण के लिए, फ़ाइलों की खोज करते समय, आमतौर पर किसी को अस्वीकृत त्रुटियों या किसी अन्य प्रकार की त्रुटियों की अनुमति मिलती है। इन त्रुटियों को किसी विशेष फ़ाइल में सहेजा जा सकता है।
    उदाहरण 1

$ ls mydir 2> त्रुटियाँfile.txt

मानक त्रुटि के लिए फ़ाइल डिस्क्रिप्टर 2 है।
यदि mydir नाम की कोई निर्देशिका नहीं है, तो कमांड का आउटपुट
"2>" का उपयोग करके फाइल को फाइल करने के लिए सेव किया जाएगा। "हम एररफाइल नामक फाइल में त्रुटि आउटपुट को फिर से निर्देशित करते हैं। txt "
इस प्रकार, प्रोग्राम आउटपुट त्रुटियों से बंद नहीं है।

मुझे उम्मीद है कि आपको अपना जवाब मिल गया होगा।


5

किसी भी ऑपरेटिंग सिस्टम में प्रक्रियाएँ (p) चल रही हैं, p1, P2, p3 और इसके आगे। प्रत्येक प्रक्रिया आमतौर पर फ़ाइलों का एक निरंतर उपयोग करती है।

प्रत्येक प्रक्रिया में एक प्रक्रिया ट्री (या एक प्रक्रिया तालिका, एक अन्य वाक्यांश में) शामिल है।

आमतौर पर, ऑपरेटिंग सिस्टम प्रत्येक प्रक्रिया में प्रत्येक फ़ाइल को एक नंबर (प्रत्येक प्रक्रिया ट्री / टेबल में) कहते हैं।

पहले की प्रक्रिया में इस्तेमाल फ़ाइल है file0 , पीछे नहीं है file1 , तीसरे स्थान पर है करें 2 , और इसके आगे।

ऐसी कोई भी संख्या एक फाइल डिस्क्रिप्टर है।

फ़ाइल डिस्क्रिप्टर आमतौर पर पूर्णांक (0, 1, 2 और 0.5, 1.5, 2.5) नहीं होते हैं।

यह देखते हुए कि हम अक्सर प्रक्रियाओं को "प्रक्रिया-तालिकाओं" के रूप में वर्णित करते हैं, और यह देखते हुए कि तालिकाओं में पंक्तियाँ (प्रविष्टियाँ) हैं हम कह सकते हैं कि प्रत्येक प्रविष्टि में फ़ाइल विवरणक सेल पूरी प्रविष्टि का प्रतिनिधित्व करने के लिए उपयोग करता है।

इसी तरह से, जब आप एक नेटवर्क सॉकेट खोलते हैं, तो इसमें एक सॉकेट विवरणक होता है।

कुछ ऑपरेटिंग सिस्टम में, आप फ़ाइल डिस्क्रिप्टर से बाहर भाग सकते हैं, लेकिन ऐसा मामला अत्यंत दुर्लभ है, और औसत कंप्यूटर उपयोगकर्ता को इससे चिंता नहीं करनी चाहिए।

फ़ाइल डिस्क्रिप्टर वैश्विक हो सकता है (प्रक्रिया ए 0 में शुरू होती है, और 1 में समाप्त होती है; प्रक्रिया बी 2 में कहना शुरू करती है, और 3 में समाप्त होती है) और इसके बाद, लेकिन जहां तक ​​मुझे पता है, आमतौर पर आधुनिक ऑपरेटिंग सिस्टम में, फ़ाइल विवरणकर्ता वैश्विक नहीं हैं, और वास्तव में प्रक्रिया-विशिष्ट हैं (प्रक्रिया ए 0 में शुरू होती है और 5 में समाप्त होती है, जबकि प्रक्रिया बी 0 से शुरू होती है और 10 में समाप्त होती है)।


: लिनक्स में एफडी के यहां पर अधिक पढ़ें unix.stackexchange.com/questions/358022/...

1
बहुत अच्छा जवाब :)
humble_wolf

5

फ़ाइल विवरणक

  • कर्नेल के लिए सभी खुली फाइलों को फाइल डिस्क्रिप्टर द्वारा संदर्भित किया जाता है।
  • एक फाइल डिस्क्रिप्टर एक गैर नकारात्मक पूर्णांक है।
  • जब हम किसी मौजूदा फ़ाइल को खोलते हैं या एक नई फ़ाइल बनाते हैं, तो कर्नेल एक प्रक्रिया के लिए एक फ़ाइल विवरणक लौटाता है।
  • जब हम किसी फ़ाइल को पढ़ना या लिखना चाहते हैं, तो हम उस फ़ाइल डिस्क्रिप्टर के साथ फ़ाइल की पहचान करते हैं, जिसे या तो पढ़ने या लिखने के तर्क के रूप में खुला या बनाया गया था।
  • प्रत्येक UNIX प्रक्रिया में 20 फ़ाइल डिस्क्रिप्टर हैं और यह निपटान, 19 के माध्यम से 0 की संख्या में है, लेकिन इसे कई प्रणालियों द्वारा 63 तक बढ़ाया गया था।
  • प्रक्रिया 0 से शुरू होने पर पहले तीन पहले ही खुल जाते हैं: मानक इनपुट 1: मानक आउटपुट 2: मानक त्रुटि आउटपुट
  • जब अभिभावक प्रक्रिया के लिए प्रक्रिया करता है, तो बाल प्रक्रिया माता-पिता के फ़ाइल विवरणकों को इनहेरिट करती है

1

सभी सरलीकृत प्रतिक्रियाओं के ऊपर जोड़।
यदि आप बैश स्क्रिप्ट में फ़ाइलों के साथ काम कर रहे हैं, तो फ़ाइल डिस्क्रिप्टर का उपयोग करना बेहतर है।
उदाहरण के लिए: -
आप फ़ाइल को "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

-5

फ़ाइल डिस्क्रिप्टर एक फ़ाइल के लिए वर्णनकर्ता हैं। वे एक फाइल के लिंक देते हैं। उनकी मदद से हम एक फ़ाइल पढ़, लिख और खोल सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.