मैं फ़ाइल सूचक (FILE * fp) को फ़ाइल डिस्क्रिप्टर (int fd) में कैसे बदल सकता हूं?


174

मेरे पास एक FILE *कॉल करके लौटा है fopen()। मुझे उस fsync(fd)पर कॉल करने के लिए, उससे एक फ़ाइल विवरणक प्राप्त करने की आवश्यकता है । फ़ाइल पॉइंटर से फाइल डिस्क्रिप्टर प्राप्त करने के लिए क्या कार्य है?


या आप फ़ाइल को खुले (2) के साथ खोल सकते हैं, और आपके पास शुरू से ही एक फाइल डिस्क्रिप्टर होगा
एंटोनी पेलीस

जवाबों:


214

उचित कार्य है int fileno(FILE *stream)। यह पाया जा सकता है <stdio.h>, और एक POSIX मानक है लेकिन मानक C नहीं है।


4
अगर समारोह वास्तव में मानक सी लाइब्रेरी का एक हिस्सा था, तो सख्ती से कहना, किसी भी हेडर या लाइब्रेरी का उल्लेख करने की कोई आवश्यकता नहीं होगी। हालांकि, यह मानक नहीं है, यही कारण है कि यह हेडर का उल्लेख करने के लिए कम से कम उल्लेख कर सकता है।
ए.टी. जूल

20
मानक सी लाइब्रेरी में कार्यों को एक्सेस करना हेडर सहित आवश्यक है, कम से कम यदि आपका कंपाइलर प्रोटोटाइप की उम्मीद करता है (मुझे कभी याद नहीं है कि वास्तव में उस संबंध में मानक व्यवहार क्या है)। हेडर के बिना, कोई नाम सी फ़ाइल की शुरुआत में परिभाषित नहीं किया जाता है।
फिल मिलर

1
@ नोवेलोक्रेट: मेरा मतलब यह नहीं था कि #includeकिसी चीज़ की कोई ज़रूरत नहीं है। मेरा मतलब केवल यह था कि एक मानक फ़ंक्शन के लिए उचित हेडर का नाम ढूंढना हमेशा आसान होता है। यानी उत्तर में सटीक हेडर नाम का उल्लेख करना वास्तव में महत्वपूर्ण नहीं है।
एनटी

9
यह एक अच्छा जवाब है, लेकिन यह ध्यान देने योग्य है कि यह एक मानक सी फ़ंक्शन नहीं है, यह एक पॉज़िक्स फ़ंक्शन है।
इवान टेरान जूल

6
यह सी मानक में नहीं है, क्योंकि फ़ाइल डिस्क्रिप्टर एक यूनिक्स चीज़ है (लिनक्स पर, यह खुला है (2), खुला नहीं (3))।
-ए-यूजर

42

यहां तक ​​कि अगर fileno(FILE *)एक फ़ाइल डिस्क्रिप्टर वापस कर सकता है, तो बहुत सावधान रहें कि stdio के बफर को बायपास न करें। यदि बफ़र डेटा है (या तो पढ़ा या अप्रभावित लेखन), तो फ़ाइल डिस्क्रिप्टर से पढ़ने / लिखने से आपको अप्रत्याशित परिणाम मिल सकते हैं।

साइड प्रश्नों में से किसी एक का उत्तर देने के लिए, फ़ाइल डिस्क्रिप्टर को FILE पॉइंटर में बदलने के लिए, उपयोग करें fdopen(3)


1
मुझे विश्वास नहीं है कि यह विशेष रूप से खोज करने वाले लोगों के लिए उपयोगी था, और यह ओपी के पोस्ट के टिप्पणी अनुभाग में पहले ही उत्तर दिया जा चुका है। यह वास्तविक जानकारी के विपरीत एक तर्क स्पष्टीकरण का अधिक है।
15

4
टिप्पणियाँ जो sooooper महत्वपूर्ण हैं उन्हें उत्तर के रूप में उठाए जाने की आवश्यकता है। टिप्पणियों का एक बड़ा हिस्सा आपके जैसे ... (और यह एक;)
व्यंग्यपूर्ण व्यर्थ की बातें हैं
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.