وظيفة Sleep () في لغة C

Wzyft Sleep Fy Lght C



عندما نقوم بتطوير برامج تتطلب تفاعل المستخدم، هناك حالات يكون من الضروري فيها ضبط أوقات النظام حتى يكون التطبيق قابلاً للقراءة وسهل الاستخدام.

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

في مقالة Linuxhint هذه، ستتعلم كيفية استخدام وظيفة Sleep() لإنشاء تأخيرات في الوقت الفعلي. سنعرض لك بناء جملة هذه الوظيفة ووصفها، بالإضافة إلى الخيارات التي يوفرها POSIX لإنشاء تأخيرات بكسور أقل من ثانية. وبعد ذلك، باستخدام الأمثلة العملية والأكواد والصور، سنوضح لك كيفية تأخير تنفيذ برنامج ما وتأثيرات الإشارات على هذه الوظيفة.








بناء جملة وظيفة Sleep() في لغة C



غير موقعة كثافة العمليات ينام ( غير موقعة كثافة العمليات ثانية )

وصف وظيفة Sleep() في لغة C

تقوم وظيفة السكون () بوضع العملية أو مؤشر الترابط في وضع السكون للوقت المحدد بالثواني في وسيطة الإدخال 'sec' وهي عدد صحيح غير موقّع. بمجرد استدعاء الدالة Sleep()، تدخل عملية الاستدعاء في وضع السكون حتى تنتهي المهلة المحددة أو تتلقى إشارة.



تُستخدم هذه الوظيفة غالبًا لفرض تأخيرات طويلة تزيد عن ثانية واحدة في تنفيذ العمليات في الوقت الفعلي. بالنسبة للتأخيرات التي تقل عن ثانية واحدة، يوفر POSIX وظيفة دقة الميكروثانية، usleep()، والتي تستخدم نفس استدعاء الأسلوب مثل Sleep(). بالنسبة للتأخيرات التي تقل عن 1 ميكروثانية، توجد أيضًا وظيفة nanosleep()‎ بدقة 1 نانو ثانية، ولكن بطريقة استدعاء مختلفة حيث تستخدم هياكل 'timespec' كوسيطات إدخال لتعيين وقت التأخير.





إذا استهلكت الدالة Sleep() كل الوقت المحدد، فإنها ترجع 0 كنتيجة. إذا تمت مقاطعة التنفيذ بوصول إشارة قبل انقضاء الوقت المحدد، فإنه يُرجع عدد الثواني المتبقية حتى ذلك الوقت.

يتم تعريف وظيفة النوم () في رأس 'unistd.h'. لاستخدامه، نحتاج إلى تضمين هذا الملف في الكود كما يلي:



#تشمل

كيفية إدخال تأخيرات في العملية باستخدام وظيفة Sleep()

في هذا المثال، قمنا بإنشاء مؤقت يتكون من حلقة لا نهائية نطبع فيها رسالة 'الوقت المنقضي' في وحدة تحكم الأوامر، متبوعة بالثواني المنقضية من العملية. يتم تكرار كل حلقة من هذه الحلقات كل ثانيتين بسبب التأخير الناتج عن وظيفة السكون ().

للقيام بذلك، نأخذ ملفًا فارغًا بامتداد '.c' ونضيف فيه الرؤوس 'stdio.h' و'unistd.h'. بعد ذلك، نفتح دالة main() فارغة ونحدد فيها الثواني المتغيرة من النوع int والتي سنستخدمها كعداد للوقت المنقضي.

بمجرد إدراج الرؤوس والإعلان عن المتغير، نفتح حلقة لا نهائية ونستخدم الدالة printf() فيها لعرض الرسالة وقيمة الوقت. في السطر التالي، نقوم بزيادة متغير الوقت بمقدار 2 ثم نستدعي الدالة Sleep() بقيمة 2 كوسيطة الإدخال. وبهذه الطريقة تتكرر هذه الدورة كل ثانية ونحصل على عداد يعرض الوقت المنقضي على الشاشة. والآن دعونا نلقي نظرة على الكود الخاص بهذا التطبيق. دعونا نرى الكود الكامل لهذا المثال:

#تشمل
#تشمل

فارغ رئيسي ( )
{
كثافة العمليات ثواني = 0 ;
بينما ( 1 )
{
printf ( 'الوقت المنقضي: %i ' , ثواني ) ;
ثواني += 2 ;
ينام ( 2 ) ;
}

}

في ما يلي، سنرى صورة لتجميع وتنفيذ هذا الكود. كما نرى، كل ثانيتين يقوم البرنامج بطباعة الثواني المنقضية على الشاشة منذ تنفيذ العملية.

تأثير الإشارات على وظيفة Sleep()

في هذا المثال، نريد ملاحظة تأثير الإشارات على العملية التي تم وضعها في وضع السكون باستخدام وظيفة السكون (). للقيام بذلك، نقوم بإنشاء تطبيق بسيط يتكون من وظيفة main() ومعالج للإشارة 36.

في السطر الأول من الدالة main()، نعلن عن المتغير المتبقي من النوع int حيث نقوم بتخزين القيمة التي يتم إرجاعها بواسطة الدالة Sleep(). بعد ذلك، نستخدم وظيفة الإشارة () لربط المعالج بالإشارة 36. في السطر التالي، نعرض معرف العملية (PID) للعملية والذي نستخدمه بعد ذلك لإرسال إشارة من الصدفة الثانية إلى العملية. أخيرًا، نستدعي الدالة Sleep() ونضبط وسيطة الإدخال الخاصة بها على 60 ثانية، وهي فترة كافية لإرسال إشارة من الصدفة الثانية. نرسل المتغير المتبقي كوسيطة الإخراج إلى النوم ().

يتكون المعالج المرتبط بالإشارة 36 ​​من سطر من التعليمات البرمجية حيث تقوم الدالة printf() بطباعة رسالة 'الوقت المتبقي:' متبوعة بالقيمة التي يتم إرجاعها بواسطة Sleep() في وقت وصول الإشارة إلى العملية. هنا، دعونا نلقي نظرة على الكود الخاص بهذا المثال.

#تشمل
#تشمل
#تشمل
#تشمل

فارغ معالج ( كثافة العمليات متبقي ) ;

فارغ رئيسي ( )
{
كثافة العمليات متبقي ;
الإشارة ( 36 , معالج ) ;
printf ( 'معرف العملية: %i ' , com.getpid ( ) ) ;
متبقي = ينام ( 60 ) ;
}

فارغ معالج ( كثافة العمليات متبقي )

{
printf ( 'الوقت المتبقي: %i ' , متبقي ) ;
}

الصورة التالية التي نراها توضح تجميع وتنفيذ هذا الكود:

لمعرفة تأثير الإشارات في هذه العملية، نقوم بتجميع هذا الكود وتشغيله. ثم، من المحطة الثانية، نرسل إشارة بالصيغة التالية:

قتل - ن إشارة PID

الصورة التالية التي نراها توضح تنفيذ الكود في وحدة التحكم السابقة وتأثيرات وصول الإشارة التي يتم إرسالها من وحدة التحكم التالية. كما ترون، قامت الإشارة بقمع تأثير وظيفة السكون () عن طريق تنشيط العملية:

خاتمة

في مقالة Linuxhint هذه، أوضحنا لك كيفية استخدام وظيفة Sleep() لوضع عملية في وضع السكون لعدد محدد من الثواني. لقد أظهرنا لك أيضًا بناء الجملة بالإضافة إلى وصف الوظيفة وطريقة الاتصال.

باستخدام الأمثلة العملية ومقتطفات التعليمات البرمجية والصور، أظهرنا لك كيفية وضع عملية في وضع السكون وما يؤثر على وصول الإشارة في عملية السكون باستخدام وظيفة Sleep().