तो जैसा:FD_CLOEXEC fcntl() ध्वज क्या करता है?
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
हालांकि मैं man fcntl
पढ़ा है, मैं समझ नहीं यह क्या करता है।
तो जैसा:FD_CLOEXEC fcntl() ध्वज क्या करता है?
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
हालांकि मैं man fcntl
पढ़ा है, मैं समझ नहीं यह क्या करता है।
यह सेट पास-ऑन-कार्यकारी फ़ाइल वर्णनकर्ता, जिसकी वजह से फ़ाइल वर्णनकर्ता स्वचालित रूप से होना करने के लिए (और atomically) के लिए झंडा बंद कर दिया जब exec
-family कार्यों के किसी भी सफल होते हैं।
यह देखने के लिए रिटर्न वैल्यू का भी परीक्षण करता है कि ऑपरेशन विफल हुआ है, जो फाइल डिस्क्रिप्टर मान्य है, बल्कि बेकार है, क्योंकि ऐसी कोई शर्त नहीं है जिसके अंतर्गत यह ऑपरेशन वैध फ़ाइल डिस्क्रिप्टर पर विफल हो।
यह फ़ाइल डिस्क्रिप्टर को चिह्नित करता है ताकि यह close()
डी स्वचालित रूप से हो जब प्रक्रिया या कोई भी बच्चे fork()
एस exec*()
कार्यों के परिवार में से एक को कॉल करता है। यह आपके फ़ाइल डिस्क्रिप्टर को यादृच्छिक प्रोग्रामों को चलाने के लिए रखना उपयोगी है। system()
।
क्या यह एक सुरक्षा चिंता है? – zach
ध्यान दें कि यह फ़ाइल डिस्क्रिप्टर से जुड़े किसी भी फ़ाइल स्ट्रीम ('FILE *') को फ़्लश करने के बारे में कुछ भी नहीं करता है। FD_CLOEXEC के लिए एक वैध उपयोग एक लॉग फ़ाइल को बंद करना है जिसे शैल प्रक्रिया निष्पादित करते समय मूल प्रक्रिया खुलती है। ध्यान दें कि POSIX 2008 के पास O_CLOEXEC के लिए ['खोलें (2)'] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/open.html) का विकल्प है - ताकि जब आप खोलें तो आप इस प्रॉपर्टी को सेट कर सकते हैं फाइल, जो व्यापक रूप से उपलब्ध होने के बाद बहुत उपयोगी होगी। –
फाइल खोले जाने पर ध्वज को व्यवस्थित रूप से सेट करना किसी भी थ्रेडेड प्रोग्राम के लिए बहुत जरूरी है जो फाइल खोल सकता है जबकि अन्य थ्रेड बाहरी प्रोग्राम निष्पादित कर सकता है। दुर्भाग्यवश यह केवल 'ओपन' के लिए उपलब्ध है और 'स्वीकार नहीं', 'सॉकेट', 'पाइप', आदि ... –
हाँ - O_CLOEXEC जोड़ने या अन्य फ़ाइल-डिस्क्रिप्टर बनाने के कार्यों के बराबर डिज़ाइन समस्याएं हैं (हालांकि 'dup () 'और' dup2() 'निश्चित रूप से प्रभावित नहीं हैं)। आपको शायद एक अतिरिक्त 'मोड' या 'झंडे' पैरामीटर के साथ नए कार्य करना होगा, जो संभवतः ऐसा क्यों नहीं हुआ है। यदि आप सॉकेट पर O_CLOEXEC का उपयोग कर सकते हैं, तो आप मान सकते हैं कि 'स्वीकार करें') उस डिस्क्रिप्टर पर उस ध्वज को क्लोन करेगा जो इसे लौटाता है। लेकिन 'सॉकेट()' और 'पाइप()' ट्रिकियर हैं। –