2010-02-08 16 views
8

में सिग्नल के कारण नींद कॉल के बाधा से बचने के लिए कैसे मैं सीरियल पोर्ट में नए डेटा के आगमन के बारे में अधिसूचित होने के लिए लिनक्स में वास्तविक समय संकेत का उपयोग कर रहा हूं। दुर्भाग्यवश यह सिग्नल होने पर नींद कॉल को बाधित करने का कारण बनता है। क्या कोई इस व्यवहार से बचने के लिए किसी तरीके से जानता है।लिनक्स

संपादित करें: मैंने नियमित सिग्नल (SIGUSR1) का उपयोग करने की कोशिश की लेकिन मुझे वही व्यवहार मिल रहा है।

धन्यवाद, जोआओ

उत्तर

12

नैनोस्लीप मैनपेज से:

नैनोस्लीप कम से कम समय * अनुरोध में निर्दिष्ट के लिए कार्यक्रम के क्रियान्वयन में देर। यदि प्रक्रिया में एक संकेत दिया गया है तो फ़ंक्शन पहले वापस आ सकता है। इस मामले में, यह -1 देता है, ईआईएनटीआर को इरनो सेट करता है, और शेष समय को रिम तक इंगित करता है जब तक कि रिम नल हो। * रीम का मूल्य फिर नैनोस्ली को कॉल करने और निर्दिष्ट विराम को पूरा करने के लिए उपयोग किया जा सकता है।

+0

मैं इस के साथ जाऊंगा। मैंने पीओसीओ पुस्तकालयों के अंदर एक नज़र डाली और उनकी थ्रेड :: नींद कार्यान्वयन आपके जैसा वर्णन करता है। धन्यवाद – jassuncao

+0

अपने चुने हुए उत्तरों को देखना न भूलें। –

+1

मैं नहीं करूँगा लेकिन मैं जवाब स्वीकार करने से पहले कुछ देर इंतजार करना पसंद करूंगा। – jassuncao

2

आप नहीं बाधित किया कारण है कि आप वास्तविक समय संकेत का उपयोग कर रहे चाहते हैं, तो?

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

+0

सिस्टम घड़ी में बदलाव होने पर इससे संबंधित सभी प्रकार की समस्याएं हैं। यही कारण है कि POSIX केवल 'नींद' कॉल की तुलना में अधिक परिष्कृत घड़ी कार्य प्रदान करता है, जिसे शायद पूरी तरह से त्याग दिया जाना चाहिए ... –

7

sigprocmask() या signal() कॉल का उपयोग करके आप लगभग सभी सिग्नल (SIGKILL को छोड़कर) मास्क कर सकते हैं। पहला व्यक्ति आपको पिछला मुखौटा वापस कर देगा, जिसे आप sleep() के बाद पुनर्प्राप्त कर सकते हैं। कुछ उदाहरण here हैं। यदि इससे मदद नहीं मिलती है, तो कृपया, सिग्नल में आपकी नींद में बाधा डालने के बारे में अधिक वर्बोज़ बनें। मुझे लगता है, आप अतिरिक्त रूप से इस स्थिति की जांच कर सकते हैं ("सिग्नल द्वारा बाधित नींद?") और फिर नींद में आती है।

+0

आपका उदाहरण लिंक टूटा हुआ है। – OxyDeadbeef

+0

कार्यों के नाम होने के साथ अन्य उदाहरणों को ढूंढना मुश्किल नहीं है, उदा। [यूनिक्स सिग्नल प्रोग्रामिंग का परिचय] (http://titania.ctie.monash.edu.au/signals/)। –

2

ठीक है, एक वास्तविक समय संकेत नींद को बाधित करना माना जाता है। आप इसके बजाए एक गैर-रीयलटाइम सिग्नल का उपयोग कर सकते हैं। एक और तरीका यह जांचना है कि क्या सोने का अनुमानित समय बीत चुका है, और यदि नहीं, तो शेष अंतराल के लिए सो जाओ।

+0

आपके उत्तर के लिए धन्यवाद, लेकिन नियमित संकेत का उपयोग करके नींद कॉल भी बाधित होती है। – jassuncao

5

नए लिनक्स कर्नेल signalfd(2) का समर्थन करते हैं। यह, sigprocmask(2) के साथ, एक epoll_wait(2) कॉल में सिग्नल और आईओ घटनाओं को संभालने का एक बहुत अच्छा तरीका है।

+0

यह कुछ ऐसा करने के लिए वास्तव में बदसूरत और गैर-पोर्टेबल तरीका है जो पूरी तरह पोर्टेसी सिस्टम (स्वयं-पाइप चाल) या सभी आधुनिक पॉज़िक्स-अनुरूप प्रणाली ('छद्म' के साथ) तक पूर्ण पोर्टेबिलिटी के साथ किया जाता है। –

+3

पोर्टेबिलिटी एक सम्मानजनक है, लेकिन हमेशा पहले, लक्ष्य नहीं। –

+0

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