2010-07-05 16 views
5

से मैं निम्नलिखित स्थिति (स्यूडोकोड):रोकें कांटा() को कॉपी सॉकेट

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 को बंद कर दिया करने के लिए नहीं कर सकते?

उत्तर

5

नहीं, आप निष्पादन पर बंद होने के लिए सभी फ़ाइल डिस्क्रिप्टर को मजबूर नहीं कर सकते हैं। आपको fork() के बाद बच्चे में सभी अवांछित फ़ाइल डिस्क्रिप्टरों पर लूप करने की आवश्यकता होगी और उन्हें बंद करें। दुर्भाग्यवश, ऐसा करने के लिए एक आसान, पोर्टेबल, तरीका नहीं है - सामान्य दृष्टिकोण का उपयोग RLIMIT_NOFILE का वर्तमान मान प्राप्त करने के लिए और 3 से उस नंबर पर लूप प्रत्येक उम्मीदवार पर close() करने का प्रयास करना है।

यदि आप केवल लिनक्स होने के लिए खुश हैं, तो आप खुले फ़ाइल डिस्क्रिप्टर को निर्धारित करने के लिए /proc/self/fd/ निर्देशिका पढ़ सकते हैं और उन्हें बंद कर सकते हैं (0, 1 और 2 को छोड़कर - जिसे या तो अकेला छोड़ा जाना चाहिए या /dev/null पर फिर से खोलना चाहिए)।

+2

या पोर्टेबल हो और केवल 'exec (2)' से पहले आवश्यक वर्णक पर 'FD_CLOEXEC' सेट करें'। –

+0

मैंने इसे प्रो फाइल सिस्टम के साथ कार्यान्वित किया, यदि आवश्यक हो तो 'गेट्रलिमिट' समाधान पर वापस आना (यदि/proc/self/fd मौजूद नहीं है)। सिर्फ एक प्रश्न: क्या 'getrlimit (RLIMIT_NOFILE, ...) - 1' और 'sysconf (_SC_OPEN_MAX)' के बीच कोई अंतर है? – AndiDog

+0

@ निकोलई: निश्चित रूप से, वह या सिर्फ 'बंद करें)' - लेकिन यह मानता है कि आप * जानते हैं कि कौन सी फाइल डिस्क्रिप्टर खुले हैं, और संदर्भ से ऐसा लगता है कि यह मामला नहीं है (क्योंकि वे तीसरे स्थान पर खोले गए हैं -party सॉफ्टवेयर)। – caf

संबंधित मुद्दे