2012-01-26 11 views
5

मेरे प्रश्न हैं:एक समारोह async-संकेत सुरक्षित है अगर (एक संकेत हैंडलर के अंदर कहा जा सकता है)

  1. वहाँ एक रास्ता निर्णायक निर्धारित करने के लिए एक समारोह async-संकेत सुरक्षित है अगर है, तो आप इसके कार्यान्वयन तक पहुंच नहीं है?
  2. यदि नहीं, तो यह जांचने का कोई तरीका है कि क्या सिग्नल हैंडलर से कॉल करने के लिए फ़ंक्शन असिंक-सिग्नल-सुरक्षित होगा?

आप संकेत के आदमी पृष्ठों पढ़ता है तो() या sigaction(), आप async-संकेत सुरक्षित कार्य (कार्यों कि सुरक्षित रूप से एक संकेत हैंडलर के अंदर कहा जा सकता है) की एक सूची प्राप्त। हालांकि, मुझे विश्वास है कि यह सूची संपूर्ण नहीं है। उदाहरण के लिए, निम्नलिखित पृष्ठ http://linux.die.net/man/7/signal, Async संकेत-सुरक्षित कार्यों शीर्षक के अंतर्गत, पढ़ता है:

POSIX.1-2004 (जिसे POSIX.1-2001 तकनीकी शुद्धिपत्र 2 जाना जाता है) के लिए एक कार्यान्वयन की आवश्यकता है गारंटी देते हैं कि निम्नलिखित कार्यों को सुरक्षित रूप से एक संकेत हैंडलर के अंदर कहा जा सकता है:

और फिर यह सामान्य async-संकेत सुरक्षित ऊपर आदमी पृष्ठों में सूचीबद्ध कार्यों सूची आगे बढ़ते हैं। जैसा कि मैंने इसे पढ़ा है, यह कहता है "यह आवश्यक है", न कि "ये केवल एकमात्र हैं"।

उदाहरण के लिए, this site कहता है कि back_trace_symbols_fd() async-signal सुरक्षित है। वह फ़ंक्शन प्राप्त करता है dladdr() से डेटा है और यह malloc() का उपयोग बैक_trace_symbols() जैसा नहीं करता है, इसलिए ऐसा लगता है कि यह सुरक्षित हो सकता है। इसके अलावा, मैंने कुछ परीक्षण किया, और dladdr() के आउटपुट स्ट्रक्चर में char * चर शामिल हैं, लेकिन इन्हें रनटाइम पर malloc'ed नहीं किया जाता है। दाढ़ी() को बुलाए जाने से पहले वे चार स्ट्रिंग रन-टाइम पर मौजूद होते हैं।

कोई भी विचार या विचार जो मुझे सही दिशा में इंगित कर सकता है उसकी सराहना की जाती है।

+2

मत भूलना ऊपर अपने प्रश्नों के जवाब उपयोगी वोट करने के लिए, या अपने प्रश्नों में से प्रत्येक के लिए सबसे उपयोगी जवाब स्वीकार करने के लिए: यह शायद आदमी पेज की सलाह का पालन करने के लिए सबसे अच्छा है। यदि आप सुनिश्चित नहीं हैं, तो [FAQ] (http://stackoverflow.com/faq) देखें और विशेष रूप से [मैं यहां प्रश्न कैसे पूछूं?] (Http://stackoverflow.com/faq#howtoask) –

उत्तर

4

यदि आपके पास फ़ंक्शन के कार्यान्वयन तक पहुंच नहीं है, तो आप मैन्युअल पृष्ठ देख सकते हैं। यदि मैनुअल पेज यह नहीं कहता कि यह एसिंक-सुरक्षित है, और POSIX मानक यह नहीं कहता कि यह एसिंक-सुरक्षित है, तो केवल सुरक्षित निष्कर्ष "यह एसिंक-सुरक्षित नहीं है" ("इसका उपयोग न करें")।

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

+0

यह दृष्टिकोण बल्कि निराशाजनक है, उदाहरण के लिए 'strlen' और' memcpy' को एसिंक-सिग्नल सुरक्षित की गारंटी नहीं है। लेकिन आपको बस इसके साथ रहना होगा - आप कभी नहीं जानते कि कुछ उज्ज्वल स्पार्क एक शानदार अनुकूलित 'memcpy' का आविष्कार करने जा रहा है जो वास्तव में पुन: प्रवेश नहीं कर रहा है।वैसे भी सी मानक कहता है कि सामान्य रूप से पुस्तकालय कार्यों को सिग्नल हैंडलर से नहीं कहा जा सकता है (एसिंक-सिग्नल-असुरक्षित केवल इतना कहता है कि इसे सिग्नल के लिए हैंडलर से नहीं कहा जा सकता है, जो कि एक और असुरक्षित फ़ंक्शन को बाधित करने के लिए हुआ था, लेकिन यह एक है वास्तव में किसी भी लाभ के लिए मुश्किल चीज)। –

+0

@SteveJessop strlen() को सिग्नेक्शन() के मैन पेज में एसिंक-सिग्नल-सुरक्षित के रूप में परिभाषित नहीं किया गया है, लेकिन आप इसके अपने संस्करण को कार्यान्वित कर सकते हैं जो एसिंक-सिग्नल-सुरक्षित है। यह सब करता है कि यह गैर-नल वर्णों की गणना करता है और जब आप उस मूल्य को वापस लौटते हैं। – Roberto

+0

@ जोनाथन लेफ्लर क्या आप जानते हैं कि क्यों कुछ मैन पेज थ्रेड-सुरक्षा और सिग्नल-सुरक्षा निर्दिष्ट करते हैं जबकि अन्य नहीं करते हैं? मुझे लगता है कि मुझे अपने ओएस के मैन पेजों का पालन करना चाहिए। कुछ मैन पेज एक विशेषता (5) फ़ंक्शन निर्दिष्ट करते हैं (सुनिश्चित नहीं है कि यह एक फ़ंक्शन है) जो यह सब कुछ निर्दिष्ट करता है। क्या आप जानते हैं कि इसका उपयोग कैसे करें? उदाहरण मैन पेज देखें: http://compute.cnr.berkeley.edu/cgi-bin/man-cgi?dladdr+3 – Roberto

0

सिग्नल हैंडलर में आप क्या हासिल करने की उम्मीद कर रहे हैं? आपको इस बात पर विचार करना चाहिए कि यह इसके लिए सही जगह है या नहीं।

In general, signal handlers should do little more 
than set a flag; most other actions are not safe. 
+1

आप सिग्नल हैंडलर के अंदर और अधिक कर सकते हैं। आपको बस सावधान रहना होगा। उदाहरण के लिए इसे देखें: http://code.google.com/p/plcrashreporter/ – Roberto

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