2011-12-13 17 views
13

का गठन क्या होता है यह कहा जाता है कि आपको सिग्नल हैंडलर के अंदर केवल असीमित-सुरक्षित फ़ंक्शन कॉल करना चाहिए। मेरा सवाल है, असीमित-सुरक्षितता क्या है? एक समारोह जो पुनर्विक्रेता और थ्रेड सुरक्षितअसीमित-सुरक्षित मुझे लगता है? याँ नहीं?एसिंक्रोनस-सुरक्षितता

+0

मिला [यह] (https://www.securecoding.cert.org/confluence/display/seccode/BB.+Definitions)। तो ऐसा लगता है कि फ़ंक्शन वैश्विक चर (परमाणु प्रकारों के बगल में) का उपयोग नहीं कर सकता है और किसी भी बिंदु पर इसे बाधित करने से प्रक्रिया को लगातार स्थिति में छोड़ देना चाहिए। – elmo

उत्तर

12

पुन: प्रवेश और थ्रेड सुरक्षा के साथ कुछ करने के लिए कुछ भी नहीं है। साइड इफेक्ट्स, राज्य और उन कार्यों के बाधा तथ्य हैं जो मायने रखती हैं।

asynchronous-safe function [जीएनयू Pth]

एक समारोह अतुल्यकालिक-सुरक्षित है, या अतुल्यकालिक संकेत सुरक्षित है, अगर यह सुरक्षित रूप से और एक संकेत हैंडलर संदर्भ में से बिना किसी दुष्प्रभाव कहा जा सकता है। यही है, यह अनुक्रमित स्थिति के बिना अनुक्रम के रैखिक रूप से चलाने के लिए किसी भी बिंदु पर बाधित होने में सक्षम होना चाहिए। यह ठीक से कार्य करना चाहिए जब वैश्विक डेटा स्वयं असंगत स्थिति में हो सकता है। कुछ अतुल्यकालिक सुरक्षित संचालन यहाँ सूचीबद्ध हैं:

  • कॉल signal() समारोह एक संकेत हैंडलर
  • बिना शर्त पुनर्स्थापित करने के लिए एक volatile sig_atomic_t चर को संशोधित (के रूप में इस प्रकार के संशोधन परमाणु है)
  • कॉल _Exit() समारोह को तुरंत कार्यान्वित करने के लिए प्रोग्राम निष्पादन
  • आपके कार्यान्वयन
  • द्वारा निर्दिष्ट अनुसार एक एसिंक्रोनस-सुरक्षित फ़ंक्शन का आह्वान करें

कुछ फ़ंक्शन पोर्टेबल एसिंक्रोनस-सुरक्षित हैं। यदि कोई फ़ंक्शन कोई अन्य संचालन करता है, तो शायद यह पोर्टेबल एसिंक्रोनस-सुरक्षित नहीं है।

अंगूठे का एक नियम यह सिग्नल हैंडलर (जैसे फ्यूटेक्स/पर्थ्रेड हालत, एपोल लूप इत्यादि) से कुछ हालत परिवर्तनीय सिग्नल है।

अद्यतन:

रूप EmployedRussian सुझाव दिया, यहां तक ​​कि फोन करने pthread_cond_signal एक बुरा विचार है। मैंने हाल ही में eglibc के स्रोत कोड की जांच की है और इसमें वहां लॉक/अनलॉक है। इस प्रकार, एक डेडलॉक के लिए एक संभावना शुरू करना। इससे हमें अन्य धागे सिग्नल करने के लिए कुछ विकल्प मिलते हैं:

  1. eventfd का उपयोग करना।
  2. वैश्विक परमाणु चर बदलना और उम्मीद है कि SA_RESTART सेट नहीं है और अन्य थ्रेड हमारे परमाणु की जांच करेंगे।
+5

ऐसे कार्यों की एक बड़ी सूची है जो [POSIX.1-2008 द्वारा एसिंक-सिग्नल-सुरक्षित होने की गारंटी है] (http://pubs.opengroup.org/onlinepubs/9699919799/functions/V2_chap02.html#tag_15_04_03) (आपको सूची के लिए थोड़ा सा स्क्रॉल करना होगा), जिसमें अधिकांश पारंपरिक-यूनिक्स "सिस्टम कॉल" और 'errno' तक पहुंच शामिल है। साथ ही, यदि आप जानते हैं कि आपके सिग्नल हैंडलर केवल तभी बुलाए जाएंगे जब [i sigsuspend'] पर सामान्य निष्पादन अवरुद्ध हो जाता है (http://pubs.opengroup.org/onlinepubs/9699919799/functions/sigsuspend.html), तो यह सुरक्षित है हैंडलर में मनमानी सामान करें। – zwol

+1

'pthread_ * 'फ़ंक्शंस में से कोई भी एसिंक-सिग्नल-सुरक्षित नहीं है, इसलिए" सिग्नल पथ्रेड कंडीशन वेरिएबल "एक बुरी सलाह (टीएम) है। –

+0

@EmployedRussian: यह नहीं कि यह सुरक्षित नहीं है, यह किसी को POSIX स्थिति चर पर प्रतीक्षा करने वाले किसी को जागृत नहीं कर सकता है। –

1

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

ओएस में फ़ंक्शंस के लिए जिन्हें आप कॉल कर सकते हैं, कॉल करने के लिए सुरक्षित होने की सूची के लिए man 7 signal देखें। ध्यान दें कि malloc() और free() सूची में नहीं हैं। पर्थ्रेड सिंक्रनाइज़ेशन एपीआई सूची में नहीं हैं, लेकिन मुझे लगता है कि कुछ को कॉल करने के लिए सुरक्षित होना होगा, ताकि आप सिग्नल हैंडलर में एक वैश्विक ध्वज सुरक्षित रूप से सेट कर सकें।

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

  • कोई संबंधित समस्या नहीं^_^