2012-10-02 24 views
7

यह एक अजीब सवाल की तरह लग सकता है, लेकिन जब मैं जाने के लिए और एक फ़ाइल खोलने:फ़ाइल डिस्क्रिप्टर में वास्तव में कितनी जानकारी संग्रहीत की जाती है?

int fd; 
fd = open("/dev/somedevice", O_RDWR); 

वास्तव में क्या मैं वापस मिल रहा है? मैं मैन पेज देख सकता हूं:
The open() function shall return a file descriptor for the named file that is the lowest file descriptor not currently open for that process

लेकिन क्या यह है? क्या यह सिर्फ int है या दृश्यों के पीछे इसके साथ डेटा संलग्न है? कारण मैं पूछ रहा हूँ मैं कुछ कोड (लिनक्स/सी) जहां हम उपयोगकर्ता अंतरिक्ष से फ़ाइल खोल रहे हैं पाया है: कर्नेल अंत पर

//User space code: 
int fdC; 

if ((fdC = open(DEVICE, O_RDWR)) < 0) { 
    printf("Error opening device %s (%s)\n", DEVICE, strerror(errno)); 
    goto error_exit; 
} 
while (!fQuit) { 
    if ((nRet = read(fdC, &rx_message, 1)) > 0) { 

तो, इस मॉड्यूल के लिए फ़ाइल आपरेशन (जो की आपूर्ति एफडी) मानचित्र n_read() कार्य करने के लिए लिखा है:

struct file_operations can_fops = { 
    owner:  THIS_MODULE, 
    lseek: NULL, 
    read: n_read, 

फिर फ़ाइल वर्णनकर्ता n_read() में प्रयोग किया जाता है, लेकिन यह डेटा प्राप्त करने पहुँचा जा रहा है: तो

int n_read(struct file *file, char *buffer, size_t count, loff_t *loff) 
{ 
    data_t * dev; 

    dev = (data_t*)file->private_data; 

... मैं फाई आंकड़ा यहाँ क्या हो रहा है या तो:

ए) एक फ़ाइल वर्णनकर्ता open() से लौटे सिर्फ एक वर्णनात्मक पूर्णांक मान की तुलना में अधिक डेटा होता है
या
बी) एक कॉल करने के लिए उपयोगकर्ता अंतरिक्ष 'isn में "पढ़ें" के बीच मानचित्रण जैसा कि मैं इसे बाहर कर रहा हूं उतना सरल हूं और इस समीकरण में कुछ कोड गायब है।

कोई भी इनपुट जो मुझे निर्देशित करने में मदद कर सकता है?

+1

'fQuit' कहां घोषित किया गया है? और हाँ फ़ाइल वर्णनकर्ता सिर्फ पूर्णांक हैं। उनके बारे में कोई भी जानकारी कर्नेल फ़ाइल डिस्क्रिप्टर तालिका से सिस्टम कॉल के साथ प्राप्त की जानी चाहिए। –

+0

@ user1700513 - आप मान सकते हैं कि 'fQuite' 0 – Mike

उत्तर

10

फ़ाइल डिस्क्रिप्टर सिर्फ int है। कर्नेल इसे एक तालिका में एक इंडेक्स के रूप में उपयोग करता है जिसमें सभी संबंधित जानकारी शामिल हैं, जिसमें फ़ाइल स्थिति, फ़ाइल ऑप्स (कर्नेल फ़ंक्शन जो read(), write(), mmap() आदि सिस्कोल प्रदान करते हैं), और इसी तरह।

जब आप open() फ़ाइल या डिवाइस पर, कर्नेल आपकी प्रक्रिया के लिए एक नई फ़ाइल डिस्क्रिप्टर प्रविष्टि बनाता है, और फ़ाइल ऑप्स सहित आंतरिक डेटा पॉप्युलेट करता है।

जब आप का उपयोग read(), write(), mmap(), एक मान्य फ़ाइल वर्णनकर्ता के साथ आदि, गिरी बस सही में गिरी समारोह लग रहा है फ़ाइल वर्णनकर्ता तालिका यह है में फ़ाइल ऑप्स के आधार पर कॉल करने के लिए (और जो फाइल डिस्क्रिप्टर इंडेक्स)। वास्तव में यह उतना आसान है।

+0

धन्यवाद, अच्छा सरल स्पष्टीकरण ... मुझे लगता है कि मैं सिर्फ अपने लिए इसे जटिल बनाने की कोशिश कर रहा था। :) – Mike

1

मुझे लगता है कि यह सिर्फ int है। Wikipedia से:

आम तौर पर, एक फ़ाइल वर्णनकर्ता कर्नेल-रेसिडेंट डाटा सभी खुली फ़ाइलों का विवरण है संरचना में एक प्रविष्टि के लिए एक सूचकांक है। POSIX में इस डेटा संरचना को फ़ाइल डिस्क्रिप्टर तालिका कहा जाता है, और प्रत्येक प्रक्रिया में अपनी फ़ाइल डिस्क्रिप्टर तालिका होती है।

3

@ नाममात्र अमीनल द्वारा मौजूदा अच्छे उत्तर के अतिरिक्त यह एक पूर्णांक है लेकिन यह फाइल डिस्क्रिप्टर तालिका नामक कर्नेल में संरचना की प्रविष्टि को इंगित करता है। लिनक्स के साथ कम से कम मामला है। कई क्षेत्रों है कि struct का हिस्सा हैं, एक दिलचस्प एक है:

FILE * pointer; // descriptor to/from reference counts etc. 

आप, एपीआई जो फ़ाइल * या वर्णनकर्ता में से एक दिया निम्नलिखित में रुचि हो सकती लौट अन्य

How to obtain FILE * from fd and vice versa

+0

' फ़ाइल डिस्क्रिप्टर टेबल ',' सिस्टम ओपन फाइल टेबल 'है: http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic =/com.ibm.aix.genprogc/डॉक्टर/genprogc/fdescript.htm – n611x007

+0

** खुली फ़ाइलों के लिए कर्नेल डेटा संरचना **: http://www.cim.mcgill.ca/~franco/OpSys-304-427/ व्याख्यान-नोट्स/node27.html – n611x007

+0

यह पूरी तरह से गलत है। लिनक्स में, मानक I/O (और 'fileno() 'और' fdopen() ') द्वारा उपयोग की जाने वाली' FILE *' का कर्नेल ['struct file'] (https: //git. कर्नेल) से कोई लेना देना नहीं है। संगठन/नाम/लिनक्स/कर्नेल/गिट/torvalds/linux.git/पेड़/शामिल/linux/fs.h # n879), शायद नाम में गुजरती समानता को छोड़कर। –