FD_CLOEXEC fcntl () ध्वज क्या करता है?


82

इस तरह:

हालांकि मैंने पढ़ा है man fcntl, मैं यह पता नहीं लगा सकता कि यह क्या करता है।

जवाबों:


74

यह फ़ाइल डिस्क्रिप्टर के लिए क्लोज़-ऑन-एग्ज़ाम फ़्लैग को सेट करता है , जिसके कारण फ़ाइल डिस्क्रिप्टर स्वचालित रूप से (और एटोमिकली) बंद हो जाता है, जब किसी भी exec-family फ़ंक्शन के सफल होने पर।

यह देखने के लिए भी रिटर्न वैल्यू का परीक्षण करता है कि क्या ऑपरेशन विफल हो गया, जो फाइल डिस्क्रिप्टर के वैध होने के बजाय बेकार है, क्योंकि कोई शर्त नहीं है जिसके तहत यह ऑपरेशन एक मान्य फाइल डिस्क्रिप्टर पर विफल होना चाहिए।


4
ध्यान दें कि यह FILE *फाइल डिस्क्रिप्टर से जुड़ी किसी भी फाइल स्ट्रीम ( ) को फ्लश करने के बारे में कुछ नहीं करता है । FD_CLOEXEC के लिए एक मान्य उपयोग एक लॉग फ़ाइल को बंद करना है जिसे शेल प्रक्रिया को निष्पादित करते समय मूल प्रक्रिया खुली है। ध्यान दें कि POSIX 2008 में open(2)O_CLOEXEC के लिए एक विकल्प है - इसलिए आप इस संपत्ति को फ़ाइल खोलते समय सेट कर सकते हैं, जो कि व्यापक रूप से उपलब्ध होने के बाद बहुत उपयोगी होगी।
जोनाथन लेफ़लर

जब फ़ाइल खोली जाती है, तो ध्वनिक रूप से ध्वज को सेट करना किसी भी थ्रेडेड प्रोग्राम के लिए बहुत आवश्यक होता है, जो फ़ाइलों को खोलना हो सकता है, जबकि एक और धागा बाहरी प्रोग्राम्स को निष्पादित कर सकता है। दुर्भाग्य से इसके लिए ही उपलब्ध है openऔर नहीं accept, socket, pipe, आदि ...
आर .. GitHub बंद की मदद बर्फ

हाँ - वहाँ (हालांकि कार्यों बनाने अन्य फ़ाइल-वर्णनकर्ता को O_CLOEXEC या समकक्ष जोड़ने डिजाइन समस्याएं हैं dup()और dup2()निश्चित रूप से प्रभावित नहीं हैं,)। संभवतः आपके पास एक अतिरिक्त 'मोड' या 'फ्लैग' पैरामीटर के साथ नए फ़ंक्शन होने चाहिए, जो संभवतः ऐसा नहीं है। यदि आप सॉकेट पर O_CLOEXEC का उपयोग कर सकते हैं, तो आप मान सकते हैं कि accept()यह विवरणक पर उस ध्वज को क्लोन कर देगा। लेकिन socket()और pipe()चालबाज हैं।
जोनाथन लेफ़लर

3
dupऔर dup2प्रभावित होते हैं। क्लोज़-ऑन-एक्ज़िक फ़्लैग फ़ाइल डिस्क्रिप्टर पर लागू होता है, न कि फ़ाइल विवरणों को खोलने के लिए, इसलिए इसे डुप्लिकेटेड फ़ाइल डिस्क्रिप्टर में साझा नहीं किया जाता है। यह बहुत अच्छी बात है।
आर .. गिटहब स्टॉप हेल्पिंग आईसीई

3
टिप्पणी में बातचीत पर के बाद, POSIX अगले अंक नए इंटरफेस जो कमियों को ठीक में शामिल करने के लिए अपनाया है: dup3, pipe2, और accept4। इसके अलावा, socketवह SOCK_CLOEXECध्वज है जिसे आप अनुरोधित सॉकेट प्रकार के साथ जोड़ सकते हैं।
आर .. गिटहब स्टॉप हेल्पिंग ICE

33

यह फ़ाइल डिस्क्रिप्टर को चिह्नित करता है ताकि यह close()स्वचालित रूप से डी हो जाए जब प्रक्रिया या किसी भी बच्चे को फ़ंक्शन fork()के exec*()परिवार में से एक कहते हैं । यह आपके फ़ाइल डिस्क्रिप्टर को उदाहरण के लिए चलाए जा रहे यादृच्छिक कार्यक्रमों से लीक करने से रोकने के लिए उपयोगी है system()


क्या यह सुरक्षा चिंता है?
zach

1
@ आप ऐसा कह सकते हैं; लेकिन तब वास्तव में आपके द्वारा किए जा रहे किसी भी रिफ्लेक्टरिंग, जैसे कि एक इकाई को एक बिखरे हुए तर्क को बदलना, एक "सुरक्षा चिंता" कहा जा सकता है, क्योंकि यह उस इकाई के गलत उपयोग के कारण बग की संभावना को कम कर देता है, और "बग" एक अमूर्त चीज है जिसमें विशेष रूप से segfaults और जानकारी लीक शामिल हैं।
हाय-एंजेल

इसलिए मैं कुछ सॉकेट कोड का पुन: निर्माण कर रहा हूं, और सॉकेट और कॉनकेक () के बीच दूरस्थ सर्वर से जुड़ा हुआ है जो वे F_SETFD का उपयोग करके सॉकेट के FD में FD_CLOEXEC ध्वज को जोड़ते हैं। फिर एक सफल कनेक्ट के बाद FD_CLOEXEC को हटा दिया जाता है। मुझे कोड के इस क्षेत्र में शामिल कोई भी निष्पादन () कॉल नहीं मिल रहा है और मैं सोच रहा हूं कि क्या वे पुराने कोड के अवशेष हैं जिन्हें हटाया जाना चाहिए था - जो नहीं थे। यह सुनिश्चित करने के लिए नहीं पता है कि यह सब क्या है।
जोमैनैसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.