2011-06-21 17 views
5

पायथन में सिग्नल प्रोसेसिंग का वर्कफ़्लो क्या है? जब सिग्नल होता है, तो मैं एक सिग्नल हैंडलर सेट करता हूं, पाइथन मेरे फ़ंक्शन का आह्वान कैसे करता है? क्या ओएस इसे सी प्रोग्राम की तरह ही आमंत्रित करता है? यदि मैं सी में पाइथन का विस्तार करता हूं, तो क्या यह तुरंत बाधित हो जाता है?पाइथन सिग्नल को कैसे संसाधित करता है?


अब यह स्पष्ट है कि पाइथन प्रक्रिया सिग्नल को कैसे संभालती है। जब आप सिग्नल मॉड्यूल द्वारा सिग्नल सेट करते हैं, तो मॉड्यूल एक फंक्शन सिग्नल_handler ($ src/मॉड्यूल/signalmodule.c देखें) पंजीकृत करेगा, जो आपके हैंडलर को सेट करता है और इसे 1 (Handlers[sig_num].tripped = 1;) के रूप में चिह्नित करता है, फिर Python दुभाषिया को बताने के लिए Py_AddPendingCall को कॉल करें। पायथन दुभाषिया Py_Mrr_CheckSignals को कॉल करने के लिए Py_MakePendingCalls का आह्वान करेगा जो आपके फ़ंक्शन को मुख्य लूप में कॉल करेगा ($ src/Python/ceval.c देखें)। यदि आप इस बारे में बात करना चाहते हैं तो मुझे संवाद करें: [email protected]

उत्तर

6

यदि आप सिग्नल मॉड्यूल का उपयोग कर पाइथन कोड सिग्नल हैंडलर सेट करते हैं तो दुभाषिया केवल बाइट-कोड दुभाषिया को फिर से दर्ज करने पर ही इसे चलाएगा। हैंडलर तुरंत नहीं चलाया जाता है। सिग्नल होने पर इसे कतार में रखा जाता है। यदि कोड पथ वर्तमान में सी कोड, अंतर्निहित या विस्तार मॉड्यूल में है, तो हैंडलर तब तक स्थगित कर दिया जाता है जब तक कि सी कोड पाइथन बाइट कोड दुभाषिया पर नियंत्रण न करे। यह एक लंबा समय हो सकता है, और आप वास्तव में भविष्यवाणी नहीं कर सकते कि कितनी देर तक।

सबसे विशेष रूप से यदि आप रीडलाइन के साथ इंटरैक्टिव मोड का उपयोग कर रहे हैं तो आपका सिग्नल हैंडलर तब तक नहीं चलेगा जब तक कि आप इसे समझने के लिए कुछ इनपुट न दें। ऐसा इसलिए है क्योंकि इनपुट कोड रीडलाइन लाइब्रेरी (सी कोड) में है और जब तक कि इसकी पूरी लाइन न हो तब तक दुभाषिया पर वापस नहीं आती है।

+0

तो पाइथन दुभाषिया सिग्नल को संभालता है और मेरा कार्य कहता है .मैं जानना चाहता हूं कि यह कैसे होता है। मैंने ignalmodule.c पढ़ा है, अजगर funcs एक सरणी में संलग्न हैं, और PyErr_CheckSignals उन समारोहों का आह्वान करते हैं जिन्हें निकाल दिया जाता है। हालांकि, ओएस द्वारा सिग्नल भेजे जाने पर PyErr_CheckSginals कहां लगाया जाता है? – renenglish

+0

ओएस द्वारा सिग्नल भेजे जाने पर इसे लागू नहीं किया जाता है। जब सिग्नल हैंडलर चलाया जा सकता है, तो इसे दुभाषिया में विभिन्न स्थानों में स्पष्ट रूप से बुलाया जाता है, जैसे प्रिंटिंग, उपयोगकर्ता इनपुट पढ़ने आदि। यह इंटरप्ट हैंडलर कतार चलाता है। – Keith

+0

Thx बहुत अधिक! अब यह स्पष्ट है कि पाइथन प्रक्रिया सिग्नल को कैसे संभालती है। जब आप सिग्नल मॉड्यूल द्वारा सिग्नल सेट करते हैं, तो मॉड्यूल एक फंक्शन सिग्नल_handler ($ src/मॉड्यूल/signalmodule.c देखें) पंजीकृत करेगा, जो आपके हैंडलर को सेट करता है और इसे 1 के रूप में चिह्नित करता है (हैंडलर [sig_num] .tripped = 1;), फिर Python दुभाषिया को बताने के लिए Py_AddPendingCall को कॉल करें। पायथन दुभाषिया Py_Mrr_CheckSignals को कॉल करने के लिए Py_MakePendingCalls का आह्वान करेगा जो आपके फ़ंक्शन को मेल लूप में कॉल करेगा ($ src/Python/ceval.c देखें)। – renenglish

0

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

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