2010-12-14 17 views
7

मैं लिनक्स कर्नेल में जगह खोजने की कोशिश कर रहा हूं जहां यह प्रक्रिया के बाद सफाई करता है। विशेष रूप से, मैं देखना चाहता हूं कि 9-सिग्नल के साथ प्रक्रिया के बाद यह खुले टीसीपी कनेक्शन को संभालता है या नहीं। मुझे पूरा यकीन है कि यह सभी कनेक्शन बंद कर देता है, लेकिन मैं विवरण देखना चाहता हूं, और यदि कोई मौका है कि कनेक्शन ठीक से बंद नहीं हैं।लिनक्स कर्नेल प्रक्रिया करता है और प्रक्रिया के बाद टीसीपी कनेक्शन क्लीनअप कहां मर जाता है?

लिनक्स कर्नेल स्रोतों के पॉइंटर्स का स्वागत है।

+0

यदि आप किसी उत्तर का शौक चाहते हैं, और यदि यह कर्नेल समस्या या नेटवर्किंग समस्या हो तो मैं उत्सुक हूं। साथ ही, अपना प्रश्न अपडेट करने से दूसरों को इस पर ठोकर खाई जाएगी। – JimB

+0

@JimB, यदि आप हमारे नेटवर्क मुद्दे में रूचि रखते हैं, तो नहीं, मुझे नहीं पता कि समस्या क्या है/थी। हमने उन निष्क्रिय कनेक्शनों को चेक किया और अब इतनी सावधानी बरतें, लेकिन बहुत अधिक ट्रैफिक है, यातायात डंप करना बहुत मुश्किल है और सत्यापित करें कि कुछ पैकेट गुम हो गए हैं या नहीं। उस समापन के बारे में, मैंने सूत्रों की जांच की कि कैफ ने उनके जवाब में उल्लेख किया है, और मेरा मानना ​​है कि कम से कम * लिनक्स कर्नेल प्रक्रियाओं की मौत के दौरान सॉकेट को बंद करने की कोशिश करता है। यदि यह सफल होता है या नहीं तो दूसरा सवाल है। –

उत्तर

10

प्रक्रिया समाप्ति का मांस exit.c:do_exit() द्वारा संभाला जाता है। यह फ़ंक्शन exit_files() पर कॉल करता है, जो बदले में put_files_struct() पर कॉल करता है, जो close_files() पर कॉल करता है। सभी फ़ाइल पर

close_files() छोरों descriptors प्रक्रिया खुला है (जो सभी सॉकेट भी शामिल है), हर एक है, जो struct file वस्तु पर fput() कॉल पर filp_close() बुला। जब struct file का अंतिम संदर्भ रखा गया है, fput() फ़ाइल ऑब्जेक्ट की .release() विधि को कॉल करता है, जो सॉकेट के लिए में sock_close() फ़ंक्शन है।

6

मुझे पूरा यकीन है कि सॉकेट क्लीनअप प्रक्रिया के मरने के बाद सभी फ़ाइल डिस्क्रिप्टर जारी करने के दुष्प्रभाव का अधिक प्रभाव है, और प्रक्रिया क्लीनअप द्वारा सीधे नहीं किया जाता है।

हालांकि मैं एक अंग पर बाहर जाने जा रहा हूं, और मान लें कि आप नेटवर्क प्रोग्रामिंग के साथ एक आम गड़बड़ी कर रहे हैं। यदि मैं यह अनुमान लगाने में सही हूं कि आपकी समस्या यह है कि प्रक्रिया के बाद किसी पते पर बाध्य करने का प्रयास करते समय आपको "उपयोग में पता" त्रुटि (EADDRINUSE) मिलती है, तो आप सॉकेट के TIME_WAIT में चल रहे हैं।

यदि ऐसा है, तो आप या तो टाइमआउट के लिए प्रतीक्षा कर सकते हैं, आमतौर पर 60 सेकंड, या आप सॉकेट को तुरंत पुन: उपयोग करने की अनुमति देने के लिए संशोधित कर सकते हैं।

int sock, ret, on; 
struct sockaddr_in servaddr; 

sock = socket(AF_INET, SOCK_STREAM, 0): 

/* Enable address reuse */ 
on = 1; 
ret = setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); 

[संपादित करें]

अपनी टिप्पणी से, ऐसा लगता है आप आधे खुले कनेक्शनों के साथ मुद्दों कर रहे हैं, और पूरी तरह से समझ में नहीं आता कि कैसे टीसीपी काम करता है की तरह। टीसीपी के पास यह जानने का कोई तरीका नहीं है कि कोई ग्राहक मर चुका है या सिर्फ निष्क्रिय है। यदि आप kill -9 क्लाइंट प्रक्रिया करते हैं, तो चार-तरफा बंद हैंडशेक कभी पूरा नहीं होता है। हालांकि यह आपके सर्वर पर खुले कनेक्शन नहीं छोड़ेगा, इसलिए आपको अभी भी यह सुनिश्चित करने के लिए नेटवर्क डंप प्राप्त करने की आवश्यकता हो सकती है कि क्या हो रहा है।

मैं यह सुनिश्चित नहीं कर सकता कि आपको यह जानने के बिना कैसे संभालना चाहिए कि आप क्या कर रहे हैं, लेकिन आप TCP Keepalive here पढ़ सकते हैं। कुछ अन्य विकल्प क्लाइंट को समय-समय पर रिक्त या शून्य संदेश भेज रहे हैं (आपके प्रोटोकॉल को संशोधित करने की आवश्यकता हो सकती है), या निष्क्रिय कनेक्शन पर हार्ड टाइमर सेट करना (परिणामस्वरूप वैध कनेक्शन गिराए जा सकते हैं)।

+0

धन्यवाद ... फ़ाइल डिस्क्रिप्टर की सफाई वास्तव में कनेक्शन बंद करने का कारण बन जाएगी। बीटीडब्ल्यू, मैं अलग-अलग समस्या में चल रहा हूं ;-) हमारा सर्वर उन ग्राहकों से पुराने कनेक्शन देखता है जो 9 के साथ मारे गए हैं, और हम यह जानने का प्रयास कर रहे हैं कि क्यों।अभी समाधान के लिए हम सर्वर से निष्क्रिय कनेक्शन स्वचालित रूप से बंद करना और SO_KEEPALIVE का उपयोग करना है, लेकिन हम भी समस्या को समझने की कोशिश कर रहे हैं। –

+0

तब ऐसा लगता है कि आपको आधे खुले कनेक्शन के साथ समस्याएं आ रही हैं। मैं अपना जवाब अपडेट करूंगा। – JimB

+0

अद्यतन के लिए धन्यवाद। मैंने कल टीसीपी रखरखाव faq पढ़ा। हमने सर्वर पर निष्क्रिय कनेक्शन छोड़ने को भी जोड़ा है। सर्वर से "पिंग्स" भेजने के लिए प्रोटोकॉल को संशोधित करना एक विकल्प नहीं है, लेकिन हम निष्क्रिय कनेक्शन को छोड़ने के साथ SO_KEEPALIVE को जोड़ देंगे, और यह हमारे लिए करना चाहिए। मुझे क्या भ्रमित करता है कि जब मैं स्थानीय रूप से हत्या -9 के साथ खेल रहा हूं, तो कर्नल इस कनेक्शन को बंद करने की कोशिश करता है। बीटीडब्ल्यू, क्लाइंट और सर्वर दोनों एक ही नेटवर्क पर हमारे नियंत्रण में हैं, हम केवल एक ही तैनाती पर इस समस्या को देख रहे हैं। –

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