.\" -*- coding: UTF-8 -*- .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: Linux-man-pages-copyleft .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH timer_create 2 "29 أكتوبر 2025" "صفحات دليل لينكس 6.18" .SH الاسم timer_create \- إنشاء مؤقت POSIX لكل عملية .SH المكتبة مكتبة الوقت الحقيقي (\fIlibrt\fP،\ \fI\-lrt\fP) .SH موجز .nf \fB#include \fP /* تعريف ثوابت \fBSIGEV_*\fP */ \fB#include \fP .P \fBint timer_create(clockid_t \fP\fIclockid\fP\fB,\fP \fB struct sigevent *_Nullable restrict \fP\fIsevp\fP\fB,\fP \fB timer_t *restrict \fP\fItimerid\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBtimer_create\fP(): .nf _POSIX_C_SOURCE >= 199309L .fi .SH الوصف تنشئ \fBtimer_create\fP() مؤقت فاصل زمني جديد لكل عملية. يُعاد معرف المؤقت الجديد في المخزن المؤقت المشار إليه بواسطة \fItimerid\fP، والذي يجب أن يكون مؤشرًا غير فارغ. هذا المعرف فريد داخل العملية، حتى يُحذف المؤقت. المؤقت الجديد يكون غير مُسلح مبدئيًا. .P تحدد الوسيطة \fIclockid\fP الساعة التي يستخدمها المؤقت الجديد لقياس الوقت. يمكن تحديدها كأحد القيم التالية: .TP \fBCLOCK_REALTIME\fP ساعة وقت حقيقي قابلة للضبط على مستوى النظام. .TP \fBCLOCK_MONOTONIC\fP .\" Note: the CLOCK_MONOTONIC_RAW clock added for clock_gettime() .\" in Linux 2.6.28 is not supported for POSIX timers -- mtk, Feb 2009 ساعة تزايدية رتيبة غير قابلة للضبط تقيس الوقت من نقطة غير محددة في الماضي لا تتغير بعد بدء تشغيل النظام. .TP \fBCLOCK_PROCESS_CPUTIME_ID\fP (منذ لينكس 2.6.12) ساعة تقيس وقت وحدة المعالجة المركزية (المستخدم والنظام) المستهلك بواسطة (جميع الخيوط في) العملية المستدعية. .TP \fBCLOCK_THREAD_CPUTIME_ID\fP (منذ لينكس 2.6.12) .\" The CLOCK_MONOTONIC_RAW that was added in Linux 2.6.28 can't be used .\" to create a timer -- mtk, Feb 2009 ساعة تقيس وقت وحدة المعالجة المركزية (المستخدم والنظام) المستهلك بواسطة الخيط المستدعي. .TP \fBCLOCK_BOOTTIME\fP (منذ لينكس 2.6.39) .\" commit 70a08cca1227dc31c784ec930099a4417a06e7d0 مثل \fBCLOCK_MONOTONIC\fP، هذه ساعة تتزايد برتابة. ومع ذلك، فبينما لا تقيس ساعة \fBCLOCK_MONOTONIC\fP الوقت أثناء تعليق النظام، فإن ساعة \fBCLOCK_BOOTTIME\fP تشمل الوقت الذي يكون فيه النظام معلقاً. هذا مفيد للتطبيقات التي تحتاج أن تكون مدركة للتعليق. ساعة \fBCLOCK_REALTIME\fP ليست مناسبة لمثل هذه التطبيقات، لأن تلك الساعة تتأثر بالتغيرات غير المستمرة في ساعة النظام. .TP \fBCLOCK_REALTIME_ALARM\fP (منذ لينكس 3.0) .\" commit 9a7adcf5c6dea63d2e47e6f6d2f7a6c9f48b9337 هذه الساعة تشبه \fBCLOCK_REALTIME\fP، لكنها ستوقظ النظام إذا كان معلقًا. يجب أن يتمتع المستدعِي بصلاحية \fBCAP_WAKE_ALARM\fP لضبط مؤقت لهذه الساعة. .TP \fBCLOCK_BOOTTIME_ALARM\fP (منذ لينكس 3.0) .\" commit 9a7adcf5c6dea63d2e47e6f6d2f7a6c9f48b9337 هذه الساعة تشبه \fBCLOCK_BOOTTIME\fP، لكنها ستوقظ النظام إذا كان معلقًا. يجب أن يتمتع المستدعِي بصلاحية \fBCAP_WAKE_ALARM\fP لضبط مؤقت لهذه الساعة. .TP \fBCLOCK_TAI\fP (منذ لينكس 3.10) ساعة على مستوى النظام مشتقة من وقت الساعة الجدارية ولكنها تحسب الثواني الكبيسة. .P انظر \fBclock_getres\fP(2) لمزيد من التفاصيل حول الساعات المذكورة أعلاه. .P بالإضافة إلى القيم أعلاه، يمكن تحديد \fIclockid\fP كـ \fIclockid\fP المُعاد بواسطة استدعاء \fBclock_getcpuclockid\fP(3) أو \fBpthread_getcpuclockid\fP(3). .P تشير الوسيطة \fIsevp\fP إلى بنية \fIsigevent\fP تحدد كيف ينبغي إعلام المستدعي عند انتهاء المؤقت. للتعريف والتفاصيل العامة لهذه البنية، انظر \fBsigevent\fP(3type). .P يمكن أن يأخذ الحقل \fIsevp.sigev_notify\fP القيم التالية: .TP \fBSIGEV_NONE\fP لا تُعلم بشكل غير متزامن عند انتهاء المؤقت. يمكن مراقبة تقدم المؤقت باستخدام \fBtimer_gettime\fP(2). .TP \fBSIGEV_SIGNAL\fP عند انتهاء المؤقت، يُولد الإشارة \fIsigev_signo\fP للعملية. انظر \fBsigevent\fP(3type) للتفاصيل العامة. سيُضبط الحقل \fIsi_code\fP من بنية \fIsiginfo_t\fP إلى \fBSI_TIMER\fP. في أي نقطة زمنية، يُصطف إشارة واحدة على الأكثر للعملية لمؤقت معين؛ انظر \fBtimer_getoverrun\fP(2) لمزيد من التفاصيل. .TP \fBSIGEV_THREAD\fP عند انتهاء المؤقت، يُستدعى \fIsigev_notify_function\fP كما لو كانت دالة بدء خيط جديد. انظر \fBsigevent\fP(3type) للتفاصيل. .TP \fBSIGEV_THREAD_ID\fP (خاص بلينكس) كما في \fBSIGEV_SIGNAL\fP، لكن الإشارة موجهة إلى الخيط الذي يُعطى معرفه في \fIsigev_notify_thread_id\fP، والذي يجب أن يكون خيطًا في نفس العملية مثل المستدعي. يحدد الحقل \fIsigev_notify_thread_id\fP معرف خيط النواة، أي القيمة المُعادة بواسطة \fBclone\fP(2) أو \fBgettid\fP(2). هذه العلامة مخصصة للاستخدام فقط من قبل مكتبات الخيوط. .P تحديد \fIsevp\fP كـ NULL يعادل تحديد مؤشر لبنية \fIsigevent\fP حيث \fIsigev_notify\fP هو \fBSIGEV_SIGNAL\fP، و\fIsigev_signo\fP هو \fBSIGALRM\fP، و\fIsigev_value.sival_int\fP هو معرف المؤقت. .SH "قيمة الإرجاع" عند النجاح، تُعيد \fBtimer_create\fP() 0، ويُوضع معرف المؤقت الجديد في \fI*timerid\fP. عند الفشل، تُعيد \-1، ويُضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEAGAIN\fP خطأ مؤقت أثناء تخصيص النواة لبنى المؤقت. .TP \fBEINVAL\fP معرف الساعة، أو \fIsigev_notify\fP، أو \fIsigev_signo\fP، أو \fIsigev_notify_thread_id\fP غير صالح. .TP \fBENOMEM\fP .\" glibc layer: malloc() تعذر تخصيص الذاكرة. .TP \fBENOTSUP\fP لا تدعم النواة إنشاء مؤقت مقابل \fIclockid\fP هذا. .TP \fBEPERM\fP كان \fIclockid\fP هو \fBCLOCK_REALTIME_ALARM\fP أو \fBCLOCK_BOOTTIME_ALARM\fP ولكن المستدعي لم يمتلك قدرة \fBCAP_WAKE_ALARM\fP. .SH الإصدارات .SS "الاختلافات بين مكتبة C والنواة" .\" See nptl/sysdeps/unix/sysv/linux/timer_create.c جزء من تنفيذ واجهة برمجة تطبيقات مؤقتات POSIX يُوفر بواسطة glibc. على وجه الخصوص: .IP \[bu] 3 معظم وظائف \fBSIGEV_THREAD\fP مُنفذة داخل glibc، وليس النواة. (هذا ضروري، لأن الخيط المشارك في معالجة الإعلام هو خيط يجب إدارته بواسطة تنفيذ خيوط POSIX لمكتبة C.) على الرغم من أن الإعلام المُسلم للعملية يكون عبر خيط، داخليًا يستخدم تنفيذ NPTL قيمة \fIsigev_notify\fP من \fBSIGEV_THREAD_ID\fP مع إشارة زمن حقيقي محجوزة بواسطة التنفيذ (انظر \fBnptl\fP(7)). .IP \[bu] تنفيذ الحالة المبدئية حيث \fIevp\fP هو NULL يُعالج داخل glibc، الذي يستدعي استدعاء النظام الأساسي مع بنية \fIsigevent\fP مملوءة بشكل مناسب. .IP \[bu] .\" See the glibc source file kernel-posix-timers.h for the structure .\" that glibc uses to map user-space timer IDs to kernel timer IDs .\" The kernel-level timer ID is exposed via siginfo.si_tid. معرفات المؤقت المُقدمة على مستوى المستخدم تُحافظ عليها glibc، التي تُخطط هذه المعرفات إلى معرفات المؤقت المستخدمة بواسطة النواة. .SH المعايير POSIX.1\-2024. .SH التاريخ لينكس 2.6. POSIX.1\-2001. .P .\" glibc commit 93a78ac437ba44f493333d7e2a4b0249839ce460 قبل لينكس 2.6، وفرت glibc تطبيقًا غير مكتمل في مساحة المستخدم (مؤقتات \fBCLOCK_REALTIME\fP فقط) باستخدام خيوط POSIX، وقبل glibc 2.17، يتراجع التطبيق إلى هذه التقنية على الأنظمة التي تشغل أنوية أقدم من لينكس 2.6. .SH ملاحظات يمكن للبرنامج إنشاء مؤقتات دورية متعددة باستخدام \fBtimer_create\fP(). .P لا تُورث المؤقتات إلى الطفل الناتج عن \fBfork\fP(2)، ويتم نزع سلاحها وحذفها أثناء \fBexecve\fP(2). .P يخصص النواة مسبقًا "إشارة زمن حقيقي في طابور" لكل مؤقت يُنشأ باستخدام \fBtimer_create\fP(). وبالتالي، يُحدد عدد المؤقتات بحد المورد \fBRLIMIT_SIGPENDING\fP (انظر \fBsetrlimit\fP(2)). .P تُعرف المؤقتات التي ينشئها \fBtimer_create\fP() باسم "مؤقتات POSIX (الدورية)". تتكون واجهة برمجة تطبيقات مؤقتات POSIX من الواجهات التالية: .TP \fBtimer_create\fP() إنشاء مؤقت. .TP \fBtimer_settime\fP(2) تسليح (بدء) أو نزع سلاح (إيقاف) مؤقت. .TP \fBtimer_gettime\fP(2) جلب الوقت المتبقي حتى انتهاء المؤقت التالي، بالإضافة إلى إعداد الفاصل الزمني للمؤقت. .TP \fBtimer_getoverrun\fP(2) إرجاع عدد التجاوزات لآخر انتهاء مؤقت. .TP \fBtimer_delete\fP(2) نزع سلاح وحذف مؤقت. .P منذ لينكس 3.10، يمكن استخدام الملف \fI/proc/\fPpid\fI/timers\fP لسرد مؤقتات POSIX للعملية ذات PID \fIpid\fP. انظر \fBproc\fP(5) لمزيد من المعلومات. .P .\" baa73d9e478ff32d62f3f9422822b59dd9a95a21 منذ لينكس 4.10، دعم مؤقتات POSIX هو خيار قابل للتكوين ومُفعّل مبدئيًا. يمكن تعطيل دعم النواة عبر الخيار \fBCONFIG_POSIX_TIMERS\fP. .SH أمثلة البرنامج أدناه يأخذ وسيطتين: فترة سكون بالثواني، وتردد مؤقت بالنانو ثانية. يُنشئ البرنامج معالجًا للإشارة التي يستخدمها للمؤقت، ويحجب تلك الإشارة، وينشئ ويسلح مؤقتًا ينتهي بالتردد المُعطى، وينام لعدد الثواني المحدد، ثم يرفع حجب إشارة المؤقت. بافتراض أن المؤقت انتهى مرة واحدة على الأقل أثناء نوم البرنامج، سيُستدعى معالج الإشارة، ويعرض المعالج بعض المعلومات حول إشعار المؤقت. ينتهي البرنامج بعد استدعاء واحد لمعالج الإشارة. .P في تشغيل المثال التالي، ينام البرنامج لمدة ثانية واحدة، بعد إنشاء مؤقت بتردد 100 نانو ثانية. بحلول وقت رفع حجب الإشارة وتسليمها، حدث حوالي عشرة ملايين تجاوز. .P .in +4n .EX $\fB ./a.out 1 100\fP; Establishing handler for signal 34 Blocking signal 34 timer ID is 0x804c008 Sleeping for 1 seconds Unblocking signal 34 Caught signal 34 sival_ptr = 0xbfb174f4; *sival_ptr = 0x804c008 overrun count = 10004886 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (timer_create.c) \& .EX #include #include #include #include #include #include #include \& #define CLOCKID CLOCK_REALTIME #define SIG SIGRTMIN \& static void print_siginfo(siginfo_t *si) { int or; timer_t *tidp; \& tidp = si\->si_value.sival_ptr; \& printf(" sival_ptr = %p; ", si\->si_value.sival_ptr); printf(" *sival_ptr = %#jx\[rs]n", (uintmax_t) *tidp); \& or = timer_getoverrun(*tidp); if (or == \-1) err(EXIT_FAILURE, "timer_getoverrun"); \& printf(" overrun count = %d\[rs]n", or); } \& static void handler(int sig, siginfo_t *si, void *uc) { /* Note: calling printf() from a signal handler is not safe (and should not be done in production programs), since printf() is not async\-signal\-safe; see signal\-safety(7). Nevertheless, we use printf() here as a simple way of showing that the handler was called. */ \& printf("Caught signal %d\[rs]n", sig); print_siginfo(si); signal(sig, SIG_IGN); } \& int main(int argc, char *argv[]) { timer_t timerid; sigset_t mask; long long freq_nanosecs; struct sigevent sev; struct sigaction sa; struct itimerspec its; \& if (argc != 3) { fprintf(stderr, "Usage: %s \[rs]n", argv[0]); exit(EXIT_FAILURE); } \& /* Establish handler for timer signal. */ \& printf("Establishing handler for signal %d\[rs]n", SIG); sa.sa_flags = SA_SIGINFO; sa.sa_sigaction = handler; sigemptyset(&sa.sa_mask); if (sigaction(SIG, &sa, NULL) == \-1) err(EXIT_FAILURE, "sigaction"); \& /* Block timer signal temporarily. */ \& printf("Blocking signal %d\[rs]n", SIG); sigemptyset(&mask); sigaddset(&mask, SIG); if (sigprocmask(SIG_SETMASK, &mask, NULL) == \-1) err(EXIT_FAILURE, "sigprocmask"); \& /* Create the timer. */ \& sev.sigev_notify = SIGEV_SIGNAL; sev.sigev_signo = SIG; sev.sigev_value.sival_ptr = &timerid; if (timer_create(CLOCKID, &sev, &timerid) == \-1) err(EXIT_FAILURE, "timer_create"); \& printf("timer ID is %#jx\[rs]n", (uintmax_t) timerid); \& /* Start the timer. */ \& freq_nanosecs = atoll(argv[2]); its.it_value.tv_sec = freq_nanosecs / 1000000000; its.it_value.tv_nsec = freq_nanosecs % 1000000000; its.it_interval.tv_sec = its.it_value.tv_sec; its.it_interval.tv_nsec = its.it_value.tv_nsec; \& if (timer_settime(timerid, 0, &its, NULL) == \-1) err(EXIT_FAILURE, "timer_settime"); \& /* Sleep for a while; meanwhile, the timer may expire multiple times. */ \& printf("Sleeping for %d seconds\[rs]n", atoi(argv[1])); sleep(atoi(argv[1])); \& /* Unlock the timer signal, so that timer notification can be delivered. */ \& printf("Unblocking signal %d\[rs]n", SIG); if (sigprocmask(SIG_UNBLOCK, &mask, NULL) == \-1) err(EXIT_FAILURE, "sigprocmask"); \& exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" .ad l .nh \fBclock_gettime\fP(2), \fBsetitimer\fP(2), \fBtimer_delete\fP(2), \fBtimer_getoverrun\fP(2), \fBtimer_settime\fP(2), \fBtimerfd_create\fP(2), \fBclock_getcpuclockid\fP(3), \fBpthread_getcpuclockid\fP(3), \fBpthreads\fP(7), \fBsigevent\fP(3type), \fBsignal\fP(7), \fBtime\fP(7) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .