تتيح لك آليات المؤقت جدولة نواة نظام التشغيل لإعلام أحد التطبيقات عند انقضاء وقت محدد مسبقًا. ستستخدمها عادةً من خلال تقديم جزأين من المعلومات. أولاً ، ستحتاج إلى تحديد مقدار الوقت الذي يجب أن يستغرقه عداد الوقت قبل الإخطار. ثانيًا ، ستحتاج إلى إعداد وظيفة رد الاتصال للعمل عند حدوث هذا الإشعار.
النهج التقليدي للموقتات
تطورت آليات الموقت في الأنظمة المستندة إلى Linux و Unix لخدمة الاحتياجات المختلفة. يمكن أن تساعدك الأساليب المختلفة في حل أنواع مختلفة من المشاكل. ومع ذلك ، سترى غالبًا الإصدار الأول من إنذار() آلية لا تزال قيد الاستخدام.
وظيفة التنبيه هي أبسط طريقة لاستخدام جهاز ضبط الوقت ؛ ها هو نموذجها الأولي:
غير موقعةintإنذار(غير موقعةint ثواني);
باستخدام هذه الطريقة ، يمكنك فقط تحديد الوقت بالثواني بأكملها. عندما يحين الوقت ، يرسل نظام التشغيل ملف سيغالرم إشارة إلى التطبيق الخاص بك. لمعالجة انتهاء صلاحية المؤقت في التطبيق الخاص بك ، يجب عليك أيضًا تحديد وظيفة رد الاتصال.
فيما يلي مثال على وظيفة معالج الإشارة:
#تضمن
#تضمن
#تضمن
#تضمنفارغtimer_callback(int إشارة)
{
time_t الآن = الوقت (لا شيء);
printf("تم تسجيل الإشارة٪ d في٪ li" ، إشارة الآن) ؛
}
intرئيسي()
{
إشارة (SIGALRM ، timer_callback) ؛
إنذار(1);
ينام(3);
إرجاع0;
}
هذا الرمز يثير أ سيغالرم بعد إشارة 1 ثانيا. إذا كنت ترغب في زيادة تأخير المؤقت إلى خمس ثوانٍ ، فما عليك سوى الاتصال إنذار (5) في حين أن. لإيقاف المؤقت ، قم بتمرير القيمة 0: إنذار (0).
عندما يحين الوقت ، لن يتم إعادة تشغيل المؤقت الذي تستخدمه بشكل دوري. على سبيل المثال ، إذا كنت تريد التأخير لمدة ثانية أخرى ، فيجب إعادة تشغيل الآلية بمكالمة أخرى لـ إنذار().
بالرغم من سهولة استخدامها ، إلا أن لهذه الطريقة بعض العيوب:
- مؤقت واحد فقط في كل مرة.
- لا يوجد دعم مؤقت للموقت.
- يمكنك فقط كتابة الفترة الزمنية بمضاعفات الثواني الكاملة.
- لا توجد طريقة لمعرفة مقدار الوقت المتبقي على جهاز ضبط الوقت.
احفظ رمز العينة الوارد أعلاه باسم ج. متي تقوم بالتجميع والتشغيل عليه ، سيقوم البرنامج باستدعاء timer_callback تعمل بعد ثانية واحدة. سينتظر بعد ذلك ثانيتين متبقيتين بسبب ملف النوم (3) الخط ، ثم إنهاء.
إنذار $ gcc -o.c
$ الوقت. / الإنذار
تم اكتشاف الإشارة 14 على 1653490465
0m1.004s حقيقي
المستخدم 0m0.000s
0m0.003 sys
سبب استخدام الأمر time هو أن تكون قادرًا على رؤية الأوقات. ولكن إذا نظرت إلى النتيجة ، فإن إجمالي وقت التشغيل ليس ثلاث ثوانٍ. هذا يرجع إلى سيغالرم إشارة من إنذار (1) عندما تكون الثانية الأولى ، بينما syscall بسبب وظيفة النوم (3) قيد التشغيل. عندما تصل هذه الإشارة ، فإنها تقاطع نظام الاتصال الذي بدأ من أجله ينام (3).
باستخدام الفاصل الزمني
كانت آلية مؤقت الفاصل الزمني متاحة لأول مرة في الإصدار 4.2 BSD. كان ذلك في وقت لاحق موحدة بواسطة POSIX. مزاياها الرئيسية على التقليدية إنذار() طريقة الموقت القائمة هي:
- يوفر دقة ميكرو ثانية.
- يسمح بالتحكم في قياس الوقت بمزيد من التفاصيل عبر ثلاثة أوضاع مختلفة.
- من الممكن ضبطه مرة واحدة وجعله يعمل بشكل دوري.
- من الممكن معرفة مدة وجوده في أي لحظة.
نماذج الوظائف المستخدمة لعمليات مؤقت الفاصل الزمني هي كما يلي:
#تضمن
intسيتايمر(int أيّ، مقدار ثابت هيكل itimerval * newValue ، هيكل itimerval * oldValue);
intgetitimer(int الذي ، قيمة هيكل itimerval *);هيكلitimerval
{
هيكلالزمنذلك;// القيمة التالية
هيكلالزمنitValue;// القيمة الحالية
};
هيكلالزمن
{
طويل tv_sec ؛
طويل tv_usec ؛
};
إذا كنت ترغب في إعداد مؤقت فاصل ، فستحتاج إلى استخدام ملف itimerval هيكل. ستحتاج إلى تمرير قيمة باستخدام هذا الهيكل باعتباره الوسيطة الثانية إلى توقيت مجموعة وظيفة.
على سبيل المثال ، يمكن إعداد مؤقت الفاصل الزمني الذي سيُعلم تطبيقك لمدة ثانية واحدة ثم كل 300 مللي ثانية على النحو التالي:
هيكلitimervalجديد;
هيكلitimervalعداد قديم;newTimer.itValue.tv_sec = 1;
newTimer.itValue.tv_usec = 0;newTimer.itInterval.tv_sec = 0;
newTimer.itInterval.tv_usec = 300 * 1000;
setitimer (ITIMER_REAL ، & newTimer ، & oldTimer) ؛
إذا كان هناك مؤقت فاصل زمني نشط قبل تعيين القيم الجديدة ، يتم نقل قيمه إلى العنوان المتغير لـ itimerval النوع المعطى للمعامل الثالث للوظيفة.
يمكنك إعداد ثلاثة أنواع مختلفة من أجهزة ضبط الوقت باستخدام آلية مؤقت الفاصل الزمني. حدد نوع المؤقت في المعلمة الأولى لـ سيتايمر ():
نوع الموقت | الإشارة | تفسير |
---|---|---|
ITIMER_REAL | سيغالرم | بغض النظر عن الوقت الذي يقضيه التطبيق ، محسوبًا على إجمالي الوقت المنقضي. |
ITIMER_VIRTUAL | SIGVTALRM | يتم حسابه على مدار الوقت الذي يعمل فيه التطبيق في وضع المستخدم فقط. |
ITIMER_PROF | SIGPROF | محسوبة على مجموع الوقت الذي يقضيه التطبيق في وضعي المستخدم والنظام. |
يمكنك أن ترى من هذا الجدول أن ملف ITIMER_REAL اكتب يرسل أ سيغالرم إشارة ، تمامًا مثل إنذار() وظيفة.
باستخدام الفاصل الزمني و إنذار() في نفس التطبيق سيكون مربكا. على الرغم من أنه يمكنك إجراء فحص ثانٍ على الوقت المتبقي باستخدام gettimer ()، فليس من المنطقي استخدامها في وقت واحد.
فيما يلي مثال على تحديد وظيفة معالج الإشارة بامتداد رأس التصحيح:
#تضمن
#تضمن
#تضمن
#تضمن
#تضمن
#تضمن
#تضمن
#تضمن "./debug.h"فارغtimer_callback(int إشارة)
{
هيكلالزمنحاليا;
gettimeofday (والآن ، لا شيء);
printf("تم تسجيل الإشارة٪ d في٪ li.٪03 لi "، Signum ، now.tv_sec ، now.tv_usec / 1000);
}intرئيسي()
{
غير موقعةint المتبقية = 3;هيكلitimervalnew_timer;
هيكلitimervalعداد قديم;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;setitimer (ITIMER_REAL، & new_timer، & old_timer) ؛
إشارة (SIGALRM ، timer_callback) ؛في حين (سكون (متبقٍ)! = 0)
{
إذا (يخطئ == EINTR)
debugf ("توقف النوم عن طريق الإشارة") ؛
آخر
errorf ("خطأ النوم٪ s" ، strerror (errno)) ؛
}
إرجاع0;
}
يستخدم الرمز أعلاه ينام() وظيفة للانتظار لمدة ثلاث ثوان. خلال هذا الوقت ، يعمل عداد الفاصل الزمني ، أولاً لمدة ثانية واحدة ، ثم على فاصل زمني قدره 300 مللي ثانية.
لفهم أفضل ، احفظ نموذج التعليمات البرمجية واجمعه بالاسم الفاصل ج:
الفاصل الزمني بين دول مجلس التعاون الخليجي $ -o.c
$ time ./interval
تم اكتشاف الإشارة 14 على 1653493614.325
التصحيح: توقف النوم عن طريق الإشارة (الفاصل الزمني الرئيسي. c: 36)
تم اكتشاف الإشارة 14 على 1653493614.625
التصحيح: توقف النوم عن طريق الإشارة (الفاصل الزمني الرئيسي. c: 36)
تم اكتشاف الإشارة 14 على 1653493614.925
التصحيح: توقف النوم عن طريق الإشارة (الفاصل الزمني الرئيسي. c: 36)
تم اكتشاف الإشارة 14 على 1653493615.225
التصحيح: توقف النوم عن طريق الإشارة (الفاصل الزمني الرئيسي. c: 36)
تم اكتشاف الإشارة 14 على 1653493615.525
...
كما ترى من الإخراج بعد تشغيل المؤقت ، فإنه يستدعي وظيفة رد الاتصال كل 300 مللي ثانية.
ومع ذلك ، بعد الانتظار لفترة أطول قليلاً ، ستلاحظ أن التطبيق لا ينتهي. يستمر في تشغيل وظيفة رد الاتصال كل 300 مللي ثانية. إذا قمت بزيادة قيمة الفاصل الزمني بالمللي ثانية ، فسترى أن التطبيق ينتهي. هذا بسبب منطقة استخدام ينام() وظيفة.
أهمية استخدام الموقتات في Linux
خاصة بالنسبة للتطبيقات في الوقت الفعلي ، فإن آلية المؤقت لها أهمية كبيرة. هذا أيضًا حل يستخدم لتحسين الأداء. يمكنك حتى استخدامه لقياس الجهوزية أو الكمون في تطبيقك. من المهم استخدام آليات المؤقت لتتبع الوقت المنقضي وأحداث انتقال الوقت.
كيفية تجميع البرامج وتثبيتها من المصدر في Linux
اقرأ التالي
مواضيع ذات صلة
- برمجة
- برمجة
- نصائح لينكس
عن المؤلف

مهندس ومطور برمجيات من محبي الرياضيات والتكنولوجيا. لطالما أحب الكمبيوتر والرياضيات والفيزياء. لقد طور مشاريع محركات الألعاب بالإضافة إلى التعلم الآلي والشبكات العصبية الاصطناعية ومكتبات الجبر الخطي. علاوة على ذلك ، يواصل العمل على التعلم الآلي والمصفوفات الخطية.
اشترك في نشرتنا الإخبارية
انضم إلى النشرة الإخبارية لدينا للحصول على نصائح تقنية ومراجعات وكتب إلكترونية مجانية وصفقات حصرية!
انقر هنا للاشتراك