2013-06-07 5 views
5

flock() में झुंड() का उपयोग आमतौर पर एसिंक-सिग्नल-सुरक्षित है क्योंकि यह एक सिस्टम कॉल है। इसके अर्थशास्त्र इसे अलग-अलग कार्यान्वित करना कठिन बनाते हैं। यह POSIX के list में एसिंक-सिग्नल-सुरक्षित फ़ंक्शंस में नहीं है क्योंकि यह POSIX में बिल्कुल नहीं है।सिग्नेशन हैंडलर

क्या बिना किसी समस्या के सिग्नेशन हैंडलर में flock() का उपयोग करना संभव है?

+1

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

+0

@ जोनाथन लेफ्लर सीएनए मैं अनलॉक करने के लिए 'झुंड() 'लॉक और' fcntl()' का उपयोग करता हूं? – MOHAMED

+0

कृपया अपने प्रारंभिक प्रश्न के लिए मेरे अतिरिक्त जवाब देखें: http://stackoverflow.com/a/16979601/694576 – alk

उत्तर

0

के लिए निम्न topic में @alk जवाब अनुसार:

हम अपने संपत्ति flock() समारोह विकसित कर सकते हैं (जैसा कि इसके नाम async_flock() हो सकता है)। हम मूल lockf() कोड की सामग्री के इस नए समारोह में कॉपी और एक async-संकेत सुरक्षित समारोह पाने के लिए तो हम क्रम में निम्नलिखित परिवर्तन करें: कोड संकलन बनाने के लिए आवश्यक:

  • __fcntlfcntl के साथ बदलें
  • errno = <errno-define> साथ __set_errno(<errno-define>) बदल देते हैं: आवश्यक कोड बनाने के लिए संकलन

  • उचित assigments struct fcntl = {0} साथ memset() करने के लिए कॉल की जगह: यह async-संकेत बचाने बनने के लिए आवश्यक है।

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