टाइमर तंत्र आपको ओएस कर्नेल को एक पूर्व निर्धारित समय बीत जाने पर किसी एप्लिकेशन को सूचित करने के लिए शेड्यूल करने देता है। आप आमतौर पर दो जानकारी प्रदान करके उनका उपयोग करेंगे। सबसे पहले, आपको यह निर्दिष्ट करने की आवश्यकता होगी कि टाइमर को सूचित करने से पहले कितना समय लेना चाहिए। दूसरे, आपको उस अधिसूचना के आने पर कार्य करने के लिए कॉलबैक फ़ंक्शन तैयार करने की आवश्यकता होगी।
टाइमर के लिए पारंपरिक दृष्टिकोण
लिनक्स और यूनिक्स-आधारित प्रणालियों में टाइमर तंत्र विभिन्न आवश्यकताओं की पूर्ति के लिए विकसित हुए हैं। विभिन्न दृष्टिकोण आपको विभिन्न प्रकार की समस्याओं को हल करने में मदद कर सकते हैं। हालाँकि, आप अक्सर इसका पहला संस्करण देखेंगे खतरे की घंटी() तंत्र अभी भी उपयोग में है।
अलार्म फ़ंक्शन टाइमर का उपयोग करने का सबसे सरल तरीका है; यहाँ इसका प्रोटोटाइप है:
अहस्ताक्षरितपूर्णांकखतरे की घंटी(अहस्ताक्षरितपूर्णांक सेकंड);
इस पद्धति का उपयोग करके, आप केवल पूरे सेकंड में समय निर्दिष्ट कर सकते हैं। जब समय समाप्त हो जाता है, तो ऑपरेटिंग सिस्टम भेजता है सिगलर्म आपके आवेदन के लिए संकेत। अपने आवेदन में टाइमर की समाप्ति को संसाधित करने के लिए, आपको कॉलबैक फ़ंक्शन को भी परिभाषित करना चाहिए।
सिग्नल हैंडलर फ़ंक्शन का एक उदाहरण यहां दिया गया है:
#शामिल
#शामिल
#शामिल
#शामिलशून्यटाइमर_कॉलबैक(पूर्णांक संकेत)
{
टाइम_टी अब = समय (शून्य);
printf("संकेत %d %li पर पकड़ा गया", साइनम, अभी);
}
पूर्णांकमुख्य()
{
सिग्नल (SIGALRM, टाइमर_कॉलबैक);
खतरे की घंटी(1);
सोना(3);
वापसी0;
}
यह कोड उठाता है a सिगलर्म संकेत के बाद 1 दूसरा। यदि आप टाइमर की देरी को पांच सेकंड तक बढ़ाना चाहते हैं, तो बस कॉल करें अलार्म (5) बजाय। टाइमर को रोकने के लिए, 0 का मान पास करें: अलार्म (0).
समय समाप्त होने पर, आपके द्वारा उपयोग किया जाने वाला टाइमर समय-समय पर पुनरारंभ नहीं होगा। उदाहरण के लिए, यदि आप एक और सेकंड के लिए देरी करना चाहते हैं, तो आपको तंत्र को एक और कॉल के साथ पुनरारंभ करना चाहिए खतरे की घंटी().
उपयोग में आसानी के बावजूद, इस पद्धति के कुछ नुकसान हैं:
- एक समय में केवल एक टाइमर।
- कोई आवधिक टाइमर समर्थन नहीं।
- आप समयावधि को केवल पूरे सेकंड के गुणकों में दे सकते हैं।
- यह जानने का कोई तरीका नहीं है कि टाइमर पर कितना समय बचा है।
ऊपर दिए गए नमूना कोड को इस रूप में सहेजें अलार्म.सी. कब आप संकलित करें और चलाएं यह, कार्यक्रम कॉल करेगा टाइमर_कॉलबैक एक सेकंड के बाद कार्य करें। इसके बाद यह शेष दो सेकंड के लिए प्रतीक्षा करेगा नींद (3) लाइन, फिर समाप्त करें।
$ gcc -o अलार्म अलार्म.c
$ समय ./अलार्म
सिग्नल 14 1653490465 को पकड़ा गया
वास्तविक 0m1.004s
उपयोगकर्ता 0m0.000s
sys 0m0.003s
टाइम कमांड का उपयोग करने का कारण समय को देखने में सक्षम होना है। लेकिन अगर आप परिणाम देखें, तो कुल चलने का समय तीन सेकंड नहीं है। यह के कारण है सिगलर्म से संकेत अलार्म (1) जब पहला सेकंड ऊपर होता है, जबकि सिस्कल नींद के कारण (3) कार्य चल रहा है। जब यह संकेत आता है, तो यह शुरू किए गए syscall को बाधित करता है नींद (3 .)).
अंतराल टाइमर का उपयोग करना
अंतराल टाइमर तंत्र पहले संस्करण 4.2 बीएसडी में उपलब्ध था। यह बाद में था POSIX. द्वारा मानकीकृत. पारंपरिक पर इसका मुख्य लाभ खतरे की घंटी() आधारित टाइमर विधि हैं:
- माइक्रोसेकंड रिज़ॉल्यूशन प्रदान करता है।
- यह तीन अलग-अलग तरीकों से अधिक विस्तार से समय माप को नियंत्रित करने की अनुमति देता है।
- इसे एक बार सेट करना और इसे समय-समय पर काम करना संभव है।
- यह पता लगाना संभव है कि यह किसी भी क्षण कितनी देर तक मौजूद है।
अंतराल टाइमर संचालन के लिए उपयोग किए जाने वाले फ़ंक्शन प्रोटोटाइप इस प्रकार हैं:
#शामिल
पूर्णांकसेटटिमर(पूर्णांक कौन सा, स्थिरांक स्ट्रक्चर इटिमरवल * न्यूवैल्यू, स्ट्रक्चर इटिमरवल * ओल्डवैल्यू);
पूर्णांकगेटीटिमेर(पूर्णांक जो, स्ट्रक्चर इटिमरवल *वैल्यू);structसमयावधि
{
structसमयावधियहअंतराल;// अगला मूल्य
structसमयावधियह मूल्य;// वर्तमान मूल्य
};
structसमयावधि
{
लंबा टीवी_सेक;
लंबा टीवी_यूसेक;
};
यदि आप एक अंतराल टाइमर सेट करना चाहते हैं, तो आपको इसका उपयोग करना होगा समयावधि संरचना आपको इस संरचना का उपयोग करके दूसरे तर्क के रूप में एक मान पास करने की आवश्यकता होगी टाइमर लगाएं समारोह।
उदाहरण के लिए, एक अंतराल टाइमर जो आपके आवेदन को 1 सेकंड के लिए सूचित करेगा और फिर प्रत्येक 300 मिलीसेकंड को निम्नानुसार सेट किया जा सकता है:
structसमयावधिनया टाइमर;
structसमयावधिपुराने टाइमर;newTimer.itValue.tv_sec = 1;
newTimer.itValue.tv_usec = 0;newTimer.itInterval.tv_sec = 0;
newTimer.itInterval.tv_usec = 300 * 1000;
सेटटिमर (ITIMER_REAL, &newTimer, &oldTimer);
यदि नए मान सेट होने से पहले एक अंतराल टाइमर सक्रिय है, तो इसके मानों को चर के पते पर स्थानांतरित कर दिया जाता है समयावधि फ़ंक्शन के तीसरे पैरामीटर को दिया गया प्रकार।
आप अंतराल टाइमर तंत्र के साथ तीन अलग-अलग प्रकार के टाइमर सेट कर सकते हैं। के पहले पैरामीटर में टाइमर प्रकार निर्दिष्ट करें सेटटिमर ():
टाइमर प्रकार | संकेत | व्याख्या |
---|---|---|
ITIMER_REAL | सिगलर्म | आवेदन द्वारा खर्च किए गए समय से स्वतंत्र, कुल बीता हुआ समय पर गणना की गई। |
ITIMER_VIRTUAL | SIGVTALRM | उस समय परिकलित किया जाता है जब एप्लिकेशन केवल उपयोगकर्ता मोड में चल रहा हो। |
ITIMER_PROF | सिगप्रोफ | उपयोगकर्ता और सिस्टम मोड दोनों में एप्लिकेशन द्वारा बिताए गए समय के योग पर परिकलित। |
आप इस तालिका से देख सकते हैं कि ITIMER_REAL टाइप ए भेजता है सिगलर्म संकेत, जैसे खतरे की घंटी() समारोह।
अंतराल टाइमर का उपयोग करना और खतरे की घंटी() एक ही आवेदन में भ्रमित हो जाएगा। यद्यपि आप शेष समय पर दूसरी जांच कर सकते हैं गेटटाइमर (), उनका एक साथ उपयोग करने का कोई मतलब नहीं है।
सिग्नल हैंडलर फ़ंक्शन को परिभाषित करने का एक उदाहरण यहां दिया गया है डिबग हेडर:
#शामिल
#शामिल
#शामिल
#शामिल
#शामिल
#शामिल
#शामिल
#शामिल "./debug.h"शून्यटाइमर_कॉलबैक(पूर्णांक संकेत)
{
structसमयावधिअभी व;
gettimeofday(&अब, शून्य);
printf("संकेत %d %li.% पर पकड़ा गया03lमैं ", साइनम, now.tv_sec, now.tv_usec / 1000);
}पूर्णांकमुख्य()
{
अहस्ताक्षरितपूर्णांक शेष = 3;structसमयावधिnew_timer;
structसमयावधिपुराने टाइमर;new_timer.it_value.tv_sec = 1;
new_timer.it_value.tv_usec = 0;
new_timer.it_interval.tv_sec = 0;
new_timer.it_interval.tv_usec = 300 * 1000;सेटटाइमर (ITIMER_REAL, &new_timer, &old_timer);
सिग्नल (SIGALRM, टाइमर_कॉलबैक);जबकि (नींद (शेष) != 0)
{
यदि (गलती == ईआईएनटीआर)
डिबगफ ("सिग्नल द्वारा बाधित नींद");
वरना
errorf ("स्लीप एरर% s", स्ट्रेरर (इरनो));
}
वापसी0;
}
उपरोक्त कोड का उपयोग करता है सोना() तीन सेकंड के लिए प्रतीक्षा करने के लिए कार्य। इस समय के दौरान, एक अंतराल टाइमर चलता है, पहले एक सेकंड के लिए, फिर 300 मिलीसेकंड के अंतराल पर।
बेहतर समझ के लिए, नाम के साथ नमूना कोड सहेजें और संकलित करें अंतराल.सी:
$ gcc -o अंतराल अंतराल.c
$ समय ./अंतराल
सिग्नल 14 1653493614.325 को पकड़ा गया
डिबग: सिग्नल द्वारा बाधित नींद (मुख्य अंतराल। सी: 36)
सिग्नल 14 1653493614.625 को पकड़ा गया
डिबग: सिग्नल द्वारा बाधित नींद (मुख्य अंतराल। सी: 36)
सिग्नल 14 1653493614.925 पर पकड़ा गया
डिबग: सिग्नल द्वारा बाधित नींद (मुख्य अंतराल। सी: 36)
सिग्नल 14 1653493615.225 पर पकड़ा गया
डिबग: सिग्नल द्वारा बाधित नींद (मुख्य अंतराल। सी: 36)
सिग्नल 14 1653493615.525 को पकड़ा गया
...
जैसा कि आप टाइमर के चलने के बाद आउटपुट से देख सकते हैं, यह हर 300 मिलीसेकंड पर कॉलबैक फ़ंक्शन को कॉल करता है।
हालाँकि, थोड़ी देर प्रतीक्षा करने के बाद, आप देखेंगे कि आवेदन समाप्त नहीं होता है। यह हर 300 मिलीसेकंड पर कॉलबैक फ़ंक्शन चलाना जारी रखता है। यदि आप मिलीसेकंड में अंतराल मान बढ़ाते हैं, तो आप देखेंगे कि एप्लिकेशन समाप्त हो गया है। यह के उपयोग क्षेत्र के कारण है सोना() समारोह।
लिनक्स में टाइमर का उपयोग करने का महत्व
विशेष रूप से वास्तविक समय के अनुप्रयोगों के लिए, टाइमर तंत्र का बहुत महत्व है। यह प्रदर्शन अनुकूलन के लिए उपयोग किया जाने वाला एक समाधान भी है। आप इसका उपयोग अपने आवेदन में अपटाइम या विलंबता को मापने के लिए भी कर सकते हैं। बीता हुआ समय और समय संक्रमण घटनाओं का ट्रैक रखने के लिए टाइमर तंत्र का उपयोग करना महत्वपूर्ण है।
लिनक्स में सोर्स से सॉफ्टवेयर को कंपाइल और इंस्टाल कैसे करें
आगे पढ़िए
संबंधित विषय
- प्रोग्रामिंग
- प्रोग्रामिंग
- लिनक्स टिप्स
लेखक के बारे में

एक इंजीनियर और सॉफ्टवेयर डेवलपर जो गणित और प्रौद्योगिकी का प्रशंसक है। उन्हें हमेशा कंप्यूटर, गणित और भौतिकी पसंद रही है। उन्होंने गेम इंजन प्रोजेक्ट के साथ-साथ मशीन लर्निंग, कृत्रिम तंत्रिका नेटवर्क और रैखिक बीजगणित पुस्तकालय विकसित किए हैं। इसके अलावा मशीन लर्निंग और लीनियर मैट्रिसेस पर काम करना जारी है।
हमारे न्यूज़लेटर की सदस्यता
तकनीकी युक्तियों, समीक्षाओं, निःशुल्क ई-पुस्तकों और अनन्य सौदों के लिए हमारे न्यूज़लेटर से जुड़ें!
सब्सक्राइब करने के लिए यहां क्लिक करें