से मैं निम्नलिखित स्थिति (स्यूडोकोड):रोकें कांटा() को कॉपी सॉकेट
function f:
pid = fork()
if pid == 0:
exec to another long-running executable (no communication needed to that process)
else:
return "something"
f
एक XmlRpc++ सर्वर पर सामने आ रहा है। जब एक्सएमएल-आरपीसी पर फ़ंक्शन को कॉल किया जाता है, तो फ़ंक्शन के बाद "कुछ" लौटाए जाने के बाद मूल प्रक्रिया "पूर्ण समापन सॉकेट" प्रिंट करती है। लेकिन XML-RPC क्लाइंट तब तक लटकता है जब तक कि बाल प्रक्रिया अभी भी चल रही है। जब मैं बाल प्रक्रिया को मारता हूं, तो एक्सएमएल-आरपीसी क्लाइंट आरपीसी कॉल को सही ढंग से खत्म करता है।
ऐसा लगता है कि मुझे fork()
बच्चे की प्रक्रिया में सॉकेट डिस्क्रिप्टर की प्रतिलिपि बनाने में समस्या है (माता-पिता को closesocket
कहा जाता है लेकिन बच्चे के पास अभी भी संदर्भ -> कनेक्शन अभी भी स्थापित है)। मैं इसे कैसे रोक सकता हूं?
संपादित करें: मैं पहले से ही FD_CLOEXEC
के बारे में पढ़ा है, लेकिन मैं बल सब वर्णनकर्ता exec
को बंद कर दिया करने के लिए नहीं कर सकते?
या पोर्टेबल हो और केवल 'exec (2)' से पहले आवश्यक वर्णक पर 'FD_CLOEXEC' सेट करें'। –
मैंने इसे प्रो फाइल सिस्टम के साथ कार्यान्वित किया, यदि आवश्यक हो तो 'गेट्रलिमिट' समाधान पर वापस आना (यदि/proc/self/fd मौजूद नहीं है)। सिर्फ एक प्रश्न: क्या 'getrlimit (RLIMIT_NOFILE, ...) - 1' और 'sysconf (_SC_OPEN_MAX)' के बीच कोई अंतर है? – AndiDog
@ निकोलई: निश्चित रूप से, वह या सिर्फ 'बंद करें)' - लेकिन यह मानता है कि आप * जानते हैं कि कौन सी फाइल डिस्क्रिप्टर खुले हैं, और संदर्भ से ऐसा लगता है कि यह मामला नहीं है (क्योंकि वे तीसरे स्थान पर खोले गए हैं -party सॉफ्टवेयर)। – caf