2010-06-27 13 views
9

इस पर कोई विचार? क्या कोई सिग्नल कतार है, या क्या इसे गिरा दिया जाता है?यूनिक्स में सिग्नल हैंडलिंग के दौरान क्या होता है, उसी सिग्नल को प्रोग्राम में भेजा जाता है?

जबकि हम इस सवाल पर हैं, क्या यह सच है कि सिग्नल हैंडलर को जितना संभव हो उतना कम काम करना चाहिए?

मैंने कहीं पढ़ा है कि सिग्नल हैंडलर को पाइप का उपयोग करना चाहिए और केवल एक बाइट लिखना चाहिए, यह दर्शाता है कि प्रोग्राम को क्या करना चाहिए। फिर कहीं और कार्यक्रम समय-समय पर पाइप की जांच करता है, और इसमें बाइट के आधार पर प्रेषण होता है। (मैंने इसे गलत समझा होगा)

धन्यवाद, बोडा साइडो।

उत्तर

8

अपने प्रश्न के दूसरे भाग का उत्तर देने के लिए, "क्या यह सच है कि सिग्नल हैंडलर को जितना संभव हो उतना कम काम करना चाहिए?" जवाब हां है, क्योंकि वहां बहुत कम फ़ंक्शन हैं जो "एसिंक सिग्नल सुरक्षित" हैं और इसलिए सिग्नल हैंडलर से कॉल करने में सक्षम हैं। Async सिग्नल सुरक्षा फिर से entrancy के एक उन्नत रूप की तरह है। यदि foo() एसिंक सिग्नल सुरक्षित है, तो इसका मतलब है कि सिग्नल हैंडलर के भीतर foo() पर कॉल करना सुरक्षित है, भले ही foo() सिग्नल उठाए जाने पर पहले ही निष्पादित हो रहा था।

आप signal (man 7 signal) के लिए सेक्शन 7 मैन पेज देखकर एसिंक सिग्नल सुरक्षित कार्यों की पूरी सूची प्राप्त कर सकते हैं। सीधे या अप्रत्यक्ष रूप से सिग्नल हैंडलर के भीतर से किसी एक के अलावा किसी भी फ़ंक्शन को कॉल करना, अपरिभाषित व्यवहार का आह्वान करता है।

"एक पाइप को एक बाइट लिखें" दृष्टिकोण एसिंक सिग्नल सुरक्षित कार्यों तक सीमित किए बिना सिग्नल से निपटने का एक शानदार तरीका है, खासकर यदि आपका प्रोग्राम पहले से ही select लूप के आसपास उन्मुख है।

7

अपने प्रश्न के पहले भाग का उत्तर देने के लिए, डिफ़ॉल्ट निम्नानुसार है: यदि यह वर्तमान में संभाला जा रहा है, तो यह एक ही सिग्नल है, नया सिग्नल अवरुद्ध है (कतार में आयोजित) और जब हैंडलर लौटाता है तो वितरित किया जाता है। अगर कुछ अन्य सिग्नल आते हैं, तो नए सिग्नल के लिए हैंडलर को बुलाया जाता है। c.f. the glibc manual

+0

या सिग्नल को अनचाहे होने पर सिग्नल के लिए डिफ़ॉल्ट कार्रवाई की जाती है –

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