इस तरह:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
हालांकि मैंने पढ़ा है man fcntl, मैं यह पता नहीं लगा सकता कि यह क्या करता है।
इस तरह:
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1) {
...
हालांकि मैंने पढ़ा है man fcntl, मैं यह पता नहीं लगा सकता कि यह क्या करता है।
जवाबों:
यह फ़ाइल डिस्क्रिप्टर के लिए क्लोज़-ऑन-एग्ज़ाम फ़्लैग को सेट करता है , जिसके कारण फ़ाइल डिस्क्रिप्टर स्वचालित रूप से (और एटोमिकली) बंद हो जाता है, जब किसी भी exec-family फ़ंक्शन के सफल होने पर।
यह देखने के लिए भी रिटर्न वैल्यू का परीक्षण करता है कि क्या ऑपरेशन विफल हो गया, जो फाइल डिस्क्रिप्टर के वैध होने के बजाय बेकार है, क्योंकि कोई शर्त नहीं है जिसके तहत यह ऑपरेशन एक मान्य फाइल डिस्क्रिप्टर पर विफल होना चाहिए।
openऔर नहीं accept, socket, pipe, आदि ...
dup()और dup2()निश्चित रूप से प्रभावित नहीं हैं,)। संभवतः आपके पास एक अतिरिक्त 'मोड' या 'फ्लैग' पैरामीटर के साथ नए फ़ंक्शन होने चाहिए, जो संभवतः ऐसा नहीं है। यदि आप सॉकेट पर O_CLOEXEC का उपयोग कर सकते हैं, तो आप मान सकते हैं कि accept()यह विवरणक पर उस ध्वज को क्लोन कर देगा। लेकिन socket()और pipe()चालबाज हैं।
dupऔर dup2प्रभावित होते हैं। क्लोज़-ऑन-एक्ज़िक फ़्लैग फ़ाइल डिस्क्रिप्टर पर लागू होता है, न कि फ़ाइल विवरणों को खोलने के लिए, इसलिए इसे डुप्लिकेटेड फ़ाइल डिस्क्रिप्टर में साझा नहीं किया जाता है। यह बहुत अच्छी बात है।
dup3, pipe2, और accept4। इसके अलावा, socketवह SOCK_CLOEXECध्वज है जिसे आप अनुरोधित सॉकेट प्रकार के साथ जोड़ सकते हैं।
यह फ़ाइल डिस्क्रिप्टर को चिह्नित करता है ताकि यह close()स्वचालित रूप से डी हो जाए जब प्रक्रिया या किसी भी बच्चे को फ़ंक्शन fork()के exec*()परिवार में से एक कहते हैं । यह आपके फ़ाइल डिस्क्रिप्टर को उदाहरण के लिए चलाए जा रहे यादृच्छिक कार्यक्रमों से लीक करने से रोकने के लिए उपयोगी है system()।
FILE *फाइल डिस्क्रिप्टर से जुड़ी किसी भी फाइल स्ट्रीम ( ) को फ्लश करने के बारे में कुछ नहीं करता है । FD_CLOEXEC के लिए एक मान्य उपयोग एक लॉग फ़ाइल को बंद करना है जिसे शेल प्रक्रिया को निष्पादित करते समय मूल प्रक्रिया खुली है। ध्यान दें कि POSIX 2008 मेंopen(2)O_CLOEXEC के लिए एक विकल्प है - इसलिए आप इस संपत्ति को फ़ाइल खोलते समय सेट कर सकते हैं, जो कि व्यापक रूप से उपलब्ध होने के बाद बहुत उपयोगी होगी।