.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2003, Nick Clifford .\" Copyright 2003, Andries E. Brouwer .\" Copyright 2020, Michael Kerrisk .\" 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 clock_getres 2 "7 مارس 2026" "صفحات دليل لينكس 6.18" .SH الاسم clock_getres, clock_gettime, clock_settime \- دوال الساعة والوقت .SH المكتبة مكتبة C القياسية (\fIlibc\fP,\ \fI\-lc\fP)، منذ glibc 2.17 .P قبل glibc 2.17، مكتبة الوقت الحقيقي (\fIlibrt\fP،\ \fI\-lrt\fP) .SH موجز .nf \fB#include \fP .P \fBint clock_getres(clockid_t \fP\fIclockid\fP\fB, struct timespec *_Nullable \fP\fIres\fP\fB);\fP .P \fBint clock_gettime(clockid_t \fP\fIclockid\fP\fB, struct timespec *\fP\fItp\fP\fB);\fP \fBint clock_settime(clockid_t \fP\fIclockid\fP\fB, const struct timespec *\fP\fItp\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBclock_getres\fP()، \fBclock_gettime\fP()، \fBclock_settime\fP(): .nf _POSIX_C_SOURCE >= 199309L .fi .SH الوصف تجد الدالة \fBclock_getres\fP() دقة (إحكام) الساعة المحددة \fIclockid\fP، وإذا كان \fIres\fP غير NULL، تخزنه في \fIstruct\ timespec\fP المشار إليه بواسطة \fIres\fP. تعتمد دقة الساعات على التنفيذ ولا يمكن تكوينها بواسطة عملية معينة. إذا كانت قيمة الوقت المشار إليها بواسطة الوسيطة \fItp\fP للدالة \fBclock_settime\fP() ليست مضاعفًا لـ \fIres\fP، فسيتم اقتطاعها إلى مضاعف لـ \fIres\fP. .P تسترجع الدالتان \fBclock_gettime\fP() و \fBclock_settime\fP() وقت الساعة المحددة \fIclockid\fP وتضبطانه. .P الوسيطتان \fIres\fP و \fItp\fP هما بنيتان من نوع \fBtimespec\fP(3). .P الوسيطة \fIclockid\fP هي معرف الساعة المحددة التي سيتم العمل عليها. قد تكون الساعة على مستوى النظام وبالتالي مرئية لجميع العمليات، أو لكل عملية إذا كانت تقيس الوقت فقط داخل عملية واحدة. .P تدعم جميع التطبيقات ساعة الوقت الحقيقي على مستوى النظام، والتي يتم تعريفها بواسطة \fBCLOCK_REALTIME\fP. يمثل وقتها الثواني والنانوثواني منذ الحقبة. عندما يتغير وقتها، لا تتأثر الموقتات لفاصل زمني نسبي، ولكن تتأثر الموقتات لنقطة زمنية مطلقة. .P قد يتم تنفيذ ساعات إضافية. تفسير قيم الوقت المقابلة والتأثير على الموقتات غير محدد. .P تدعم الإصدارات الحديثة بما فيه الكفاية من glibc ونواة لينكس الساعات التالية: .TP \fBCLOCK_REALTIME\fP ساعة قابلة للضبط على مستوى النظام تقيس الوقت الحقيقي (أي وقت الحائط). يتطلب ضبط هذه الساعة صلاحيات مناسبة. تتأثر هذه الساعة بالقفزات غير المستمرة في وقت النظام (مثلًا، إذا قام مسؤول النظام بتغيير الساعة يدويًا)، وبضبط التردد الذي تقوم به NTP والتطبيقات المماثلة عبر \fBadjtime\fP(3)، \fBadjtimex\fP(2)، \fBclock_adjtime\fP(2)، و \fBntp_adjtime\fP(3). تحسب هذه الساعة عادةً عدد الثواني منذ 1970\-01\-01 00:00:00 التوقيت العالمي المنسق (UTC) باستثناء أنها تتجاهل الثواني الكبيسة؛ بالقرب من ثانية كبيسة، يتم ضبطها عادةً بواسطة NTP للبقاء متزامنة تقريبًا مع UTC. .TP \fBCLOCK_REALTIME_ALARM\fP (منذ لينكس 3.0؛ خاص بلينكس) مثل \fBCLOCK_REALTIME\fP، ولكن قابل للضبط فقط بشكل غير مباشر عن طريق ضبط \fBCLOCK_REALTIME\fP، ويتصرف بشكل مختلف إذا كان النظام معلقًا. انظر \fBtimer_create\fP(2). .TP \fBCLOCK_REALTIME_COARSE\fP (منذ لينكس 2.6.32؛ خاص بلينكس) .\" Added in commit da15cfdae03351c689736f8d142618592e3cebc3 نسخة أسرع ولكن أقل دقة من \fBCLOCK_REALTIME\fP. قابل للضبط فقط بشكل غير مباشر عن طريق ضبط \fBCLOCK_REALTIME\fP. استخدمه عندما تحتاج إلى طوابع زمنية سريعة جدًا، ولكن ليست دقيقة. يتطلب دعمًا لكل بنية، وربما أيضًا دعم بنية لهذه العلامة في \fBvdso\fP(7). .TP \fBCLOCK_TAI\fP (منذ لينكس 3.10؛ خاص بلينكس) .\" commit 1ff3c9677bff7e468e0c487d0ffefe4e901d33f4 ساعة على مستوى النظام مشتقة من وقت الحائط ولكنها تحسب الثواني الكبيسة. لا تواجه هذه الساعة تعديلات الساعة الناتجة عن إدراج الثواني الكبيسة كما تفعل \fBCLOCK_REALTIME\fP. تحسب الثواني منذ 1970\-01\-01 00:00 TAI (1969\-12\-31 23:59:50 UTC)، لذا فإن حقبتها تسبق حقبة \fBCLOCK_REALTIME\fP بعشر ثوانٍ. ومع ذلك، يتطلب تنفيذها مساعدة من NTP، وإذا لم تكن هذه المساعدة متاحة، فإنها تتصرف مثل \fBCLOCK_REALTIME\fP بدلاً من ذلك. .IP علاقتها بـ \fBCLOCK_REALTIME\fP للطوابع الزمنية قبل 1972 تقريبية فقط، حيث تم تقديم نظام الثواني الكبيسة في 1972\-01\-01. نظرًا لأنه من المخطط إيقاف الثواني الكبيسة، فمن المحتمل أن تظل قيمتها من الآن فصاعدًا أكبر بـ 37 ثانية بالضبط من قيمة \fBCLOCK_REALTIME\fP لسنوات عديدة، وبعد ذلك من المحتمل أن يتم ضبط إزاحتها عن \fBCLOCK_REALTIME\fP بواسطة آلية أخرى غير محددة بعد. قابلة للضبط فقط بشكل غير مباشر عن طريق ضبط \fBCLOCK_REALTIME\fP. .IP يرمز الاختصار TAI إلى العبارة الفرنسية "temps atomique international"، أو التوقيت الذري الدولي. .TP \fBCLOCK_MONOTONIC\fP ساعة غير قابلة للضبط على مستوى النظام تمثل الوقت الرتيب منذ\[em]كما هو موصوف بواسطة POSIX\[em]"نقطة غير محددة في الماضي". على لينكس، تتوافق تلك النقطة مع عدد الثواني التي كان النظام يعمل فيها منذ تشغيله. .IP لا تتأثر ساعة \fBCLOCK_MONOTONIC\fP بالقفزات غير المستمرة في وقت النظام (مثلًا، إذا قام مسؤول النظام بتغيير الساعة يدويًا)، ولكنها تتأثر بضبط التردد. لا تحسب هذه الساعة الوقت الذي يكون فيه النظام معلقًا. تضمن جميع متغيرات \fBCLOCK_MONOTONIC\fP أن الوقت الذي يتم إرجاعه بواسطة الاستدعاءات المتتالية لن يعود إلى الوراء، ولكن الاستدعاءات المتتالية قد\[em]اعتمادًا على البنية\[em]تُرجع قيم وقت متطابقة (غير متزايدة). .TP \fBCLOCK_MONOTONIC_COARSE\fP (منذ لينكس 2.6.32؛ خاص بلينكس) .\" Added in commit da15cfdae03351c689736f8d142618592e3cebc3 نسخة أسرع ولكن أقل دقة من \fBCLOCK_MONOTONIC\fP. استخدمه عندما تحتاج إلى طوابع زمنية سريعة جدًا، ولكن ليست دقيقة. يتطلب دعمًا لكل بنية، وربما أيضًا دعم بنية لهذه العلامة في \fBvdso\fP(7). .TP \fBCLOCK_MONOTONIC_RAW\fP (منذ لينكس 2.6.28؛ خاص بلينكس) .\" Added in commit 2d42244ae71d6c7b0884b5664cf2eda30fb2ae68, John Stultz مشابه لـ \fBCLOCK_MONOTONIC\fP، ولكنه يوفر الوصول إلى وقت خام قائم على العتاد لا يخضع لضبط التردد. لا تحسب هذه الساعة الوقت الذي يكون فيه النظام معلقًا. .TP \fBCLOCK_BOOTTIME\fP (منذ لينكس 2.6.39؛ خاص بلينكس) .\" commit 7fdd7f89006dd5a4c702fa0ce0c272345fa44ae0 .\" commit 70a08cca1227dc31c784ec930099a4417a06e7d0 ساعة نظامية غير قابلة للضبط مطابقة لـ \fBCLOCK_MONOTONIC\fP، باستثناء أنها تتضمن أيضًا أي وقت يكون فيه النظام معلقًا. يسمح هذا للتطبيقات بالحصول على ساعة رتيبة واعية بالتعليق دون الحاجة إلى التعامل مع تعقيدات \fBCLOCK_REALTIME\fP، التي قد تحتوي على انقطاعات إذا تم تغيير الوقت باستخدام \fBsettimeofday\fP(2) أو ما شابه. .TP \fBCLOCK_BOOTTIME_ALARM\fP (منذ لينكس 3.0؛ خاص بلينكس) مثل \fBCLOCK_BOOTTIME\fP، لكنه يتصرف بشكل مختلف إذا كان النظام معلقًا. انظر \fBtimer_create\fP(2). .TP \fBCLOCK_PROCESS_CPUTIME_ID\fP (منذ لينكس 2.6.12) تقيس هذه الساعة وقت وحدة المعالجة المركزية المستهلك بواسطة هذه العملية (أي وقت وحدة المعالجة المركزية المستهلك بواسطة جميع الخيوط في العملية). في لينكس، هذه الساعة غير قابلة للضبط. .TP \fBCLOCK_THREAD_CPUTIME_ID\fP (منذ لينكس 2.6.12) تقيس هذه الساعة وقت وحدة المعالجة المركزية المستهلك بواسطة هذا الخيط. في لينكس، هذه الساعة غير قابلة للضبط. .P ينفذ لينكس أيضًا مثيلات ساعة ديناميكية كما هو موضح أدناه. .SS "الساعات الديناميكية" بالإضافة إلى معرفات الساعة بنمط System\-V المرمزة بشكل ثابت الموصوفة أعلاه، يدعم لينكس أيضًا عمليات ساعة POSIX على أجهزة حرفية معينة. تسمى هذه الأجهزة ساعات "ديناميكية"، وهي مدعومة منذ لينكس 2.6.39. .P باستخدام وحدات الماكرو المناسبة، يمكن تحويل واصفات الملفات المفتوحة إلى معرفات ساعة وتمريرها إلى \fBclock_gettime\fP() و \fBclock_settime\fP() و \fBclock_adjtime\fP(2). يوضح المثال التالي كيفية تحويل واصف ملف إلى معرف ساعة ديناميكي. .P .in +4n .EX #define CLOCKFD 3 #define FD_TO_CLOCKID(fd) ((\[ti](clockid_t) (fd) << 3) | CLOCKFD) #define CLOCKID_TO_FD(clk) ((unsigned int) \[ti]((clk) >> 3)) \& struct timespec ts; clockid_t clkid; int fd; \& fd = open("/dev/ptp0", O_RDWR); clkid = FD_TO_CLOCKID(fd); clock_gettime(clkid, &ts); .EE .in .SH "قيمة الإرجاع" تعيد \fBclock_gettime\fP() و \fBclock_settime\fP() و \fBclock_getres\fP() 0 عند النجاح. عند الخطأ، يتم إرجاع \-1 ويتم تعيين \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEACCES\fP لا يمتلك \fBclock_settime\fP() إذن الكتابة لجهاز الساعة POSIX الديناميكي المشار إليه. .TP \fBEFAULT\fP يشير \fItp\fP إلى خارج مساحة العنوان القابلة للوصول. .TP \fBEINVAL\fP .\" Linux also gives this error on attempts to set CLOCK_PROCESS_CPUTIME_ID .\" and CLOCK_THREAD_CPUTIME_ID, when probably the proper error should be .\" EPERM. \fIclockid\fP المحدد غير صالح لأحد سببين. إما أن القيمة الموجبة المرمزة بشكل ثابت بنمط System\-V خارج النطاق، أو أن معرف الساعة الديناميكي لا يشير إلى مثيل صالح لكائن ساعة. .TP \fBEINVAL\fP (\fBclock_settime\fP()): \fItp.tv_sec\fP سالب أو \fItp.tv_nsec\fP خارج النطاق [0, 999,999,999]. .TP \fBEINVAL\fP \fIclockid\fP المحدد في استدعاء لـ \fBclock_settime\fP() ليس ساعة قابلة للضبط. .TP \fBEINVAL\fP (منذ لينكس 4.3) .\" commit e1d7ba8735551ed79c7a0463a042353574b96da3 حاول استدعاء لـ \fBclock_settime\fP() مع \fIclockid\fP بقيمة \fBCLOCK_REALTIME\fP ضبط الوقت على قيمة أقل من القيمة الحالية لساعة \fBCLOCK_MONOTONIC\fP. .TP \fBENODEV\fP اختفى الجهاز القابل للتبديل السريع (مثل USB على سبيل المثال) الممثل بواسطة \fIclk_id\fP ديناميكي بعد فتح جهازه الحرفي. .TP \fBENOTSUP\fP العملية غير مدعومة من قبل جهاز الساعة POSIX الديناميكي المحدد. .TP \fBEOVERFLOW\fP الطابع الزمني لن يتسع في نطاق \fItime_t\fP. يمكن أن يحدث هذا إذا تم تشغيل ملف تنفيذي مع \fItime_t\fP 32 بت على نواة 64 بت عندما يكون الوقت 2038\-01\-19 03:14:08 UTC أو لاحقًا. ومع ذلك، عندما يكون وقت النظام خارج نطاق \fItime_t\fP في حالات أخرى، يكون السلوك غير محدد. .TP \fBEPERM\fP لا يمتلك \fBclock_settime\fP() الإذن لضبط الساعة المشار إليها. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBclock_getres\fP(), \fBclock_gettime\fP(), \fBclock_settime\fP() T} سلامة الخيوط MT\-Safe .TE .SH الإصدارات يحدد POSIX.1 ما يلي: .RS .P ضبط قيمة ساعة \fBCLOCK_REALTIME\fP عبر \fBclock_settime\fP() لن يكون له أي تأثير على الخيوط المحظورة في انتظار خدمة وقت نسبي بناءً على هذه الساعة، بما في ذلك دالة \fBnanosleep\fP()؛ ولا على انتهاء صلاحية المؤقتات النسبية بناءً على هذه الساعة. وبالتالي، ستنتهي صلاحية خدمات الوقت هذه عندما ينقضي الفاصل الزمني النسبي المطلوب، بغض النظر عن القيمة الجديدة أو القديمة للساعة. .RE .P .\" See http://bugzilla.kernel.org/show_bug.cgi?id=11972 وفقًا لـ POSIX.1\-2001، يمكن لعملية ذات "امتيازات مناسبة" ضبط ساعتي \fBCLOCK_PROCESS_CPUTIME_ID\fP و \fBCLOCK_THREAD_CPUTIME_ID\fP باستخدام \fBclock_settime\fP(). في لينكس، هذه الساعات غير قابلة للضبط (أي لا توجد عملية لها "امتيازات مناسبة"). .SS "الاختلافات بين مكتبة C والنواة" في بعض البنى، يتم توفير تطبيق لـ \fBclock_gettime\fP() في \fBvdso\fP(7). .SH المعايير POSIX.1\-2024. .SH التاريخ POSIX.1\-1996، لينكس 2.6. .P في أنظمة POSIX التي تتوفر فيها هذه الدوال، يتم تعريف الرمز \fB_POSIX_TIMERS\fP في \fI\fP بقيمة أكبر من 0. يجعل POSIX.1\-2008 هذه الدوال إلزامية. .P .\" تشير الرموز \fB_POSIX_MONOTONIC_CLOCK\fP و \fB_POSIX_CPUTIME\fP و \fB_POSIX_THREAD_CPUTIME\fP إلى أن \fBCLOCK_MONOTONIC\fP و \fBCLOCK_PROCESS_CPUTIME_ID\fP و \fBCLOCK_THREAD_CPUTIME_ID\fP متوفرة. (انظر أيضًا \fBsysconf\fP(3).) .P جعل POSIX.1\-2024 \fBCLOCK_MONOTONIC\fP إلزاميًا. .SS "ملاحظة تاريخية لأنظمة SMP" قبل أن يضيف لينكس دعم النواة لـ \fBCLOCK_PROCESS_CPUTIME_ID\fP و \fBCLOCK_THREAD_CPUTIME_ID\fP، نفذت glibc هذه الساعات على العديد من المنصات باستخدام مسجلات المؤقت من وحدات المعالجة المركزية (TSC على i386، AR.ITC على Itanium). قد تختلف هذه المسجلات بين وحدات المعالجة المركزية، وكنتيجة لذلك قد تعيد هذه الساعات \fBنتائج زائفة\fP إذا تم ترحيل عملية إلى وحدة معالجة مركزية أخرى. .P إذا كانت وحدات المعالجة المركزية في نظام SMP تمتلك مصادر ساعة مختلفة، فلا توجد طريقة للحفاظ على ترابط بين مسجلات المؤقت لأن كل وحدة معالجة مركزية ستعمل بتردد مختلف قليلاً. إذا كان الأمر كذلك، فإن \fIclock_getcpuclockid(0)\fP سيعيد \fBENOENT\fP للإشارة إلى هذه الحالة. عندها ستكون الساعتان مفيدتين فقط إذا أمكن ضمان بقاء عملية على وحدة معالجة مركزية معينة. .P لا تبدأ المعالجات في نظام SMP جميعها في نفس الوقت تمامًا، وبالتالي تعمل مسجلات المؤقت عادةً بإزاحة. تتضمن بعض البنيات كودًا يحاول الحد من هذه الإزاحات عند الإقلاع. ومع ذلك، لا يمكن للكود ضمان ضبط الإزاحات بدقة. لا تحتوي glibc على أحكام للتعامل مع هذه الإزاحات (على عكس نواة لينكس). عادةً ما تكون هذه الإزاحات صغيرة، وبالتالي قد تكون التأثيرات ضئيلة في معظم الحالات. .P منذ glibc 2.4، تتجنب دوال التغليف لاستدعاءات النظام الموصوفة في هذه الصفحة المشاكل المذكورة أعلاه باستخدام تنفيذ النواة لـ \fBCLOCK_PROCESS_CPUTIME_ID\fP و \fBCLOCK_THREAD_CPUTIME_ID\fP، على الأنظمة التي توفر مثل هذا التنفيذ (أي لينكس 2.6.12 والإصدارات الأحدث). .SH أمثلة يوضح البرنامج أدناه استخدام \fBclock_gettime\fP() و \fBclock_getres\fP() مع ساعات مختلفة. هذا مثال لما قد نراه عند تشغيل البرنامج: .P .in +4n .EX $\fB ./clock_times x\fP; CLOCK_REALTIME : 1585985459.446 (18356 days + 7h 30m 59s) resolution: 0.000000001 CLOCK_TAI : 1585985496.447 (18356 days + 7h 31m 36s) resolution: 0.000000001 CLOCK_MONOTONIC: 52395.722 (14h 33m 15s) resolution: 0.000000001 CLOCK_BOOTTIME : 72691.019 (20h 11m 31s) resolution: 0.000000001 .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (clock_getres.c) \& .EX /* clock_times.c \& Licensed under GNU General Public License v2 or later. */ #define _XOPEN_SOURCE 600 #include #include #include #include #include #include \& #define SECS_IN_DAY (24 * 60 * 60) \& static void displayClock(clockid_t clock, const char *name, bool showRes) { long days; struct timespec ts; \& if (clock_gettime(clock, &ts) == \-1) { perror("clock_gettime"); exit(EXIT_FAILURE); } \& printf("%\-15s: %10jd.%03ld (", name, (intmax_t) ts.tv_sec, ts.tv_nsec / 1000000); \& days = ts.tv_sec / SECS_IN_DAY; if (days > 0) printf("%ld days + ", days); \& printf("%2dh %2dm %2ds", (int) (ts.tv_sec % SECS_IN_DAY) / 3600, (int) (ts.tv_sec % 3600) / 60, (int) ts.tv_sec % 60); printf(")\[rs]n"); \& if (clock_getres(clock, &ts) == \-1) { perror("clock_getres"); exit(EXIT_FAILURE); } \& if (showRes) printf(" resolution: %10jd.%09ld\[rs]n", (intmax_t) ts.tv_sec, ts.tv_nsec); } \& int main(int argc, char *[]) { bool showRes = argc > 1; \& displayClock(CLOCK_REALTIME, "CLOCK_REALTIME", showRes); #ifdef CLOCK_TAI displayClock(CLOCK_TAI, "CLOCK_TAI", showRes); #endif displayClock(CLOCK_MONOTONIC, "CLOCK_MONOTONIC", showRes); #ifdef CLOCK_BOOTTIME displayClock(CLOCK_BOOTTIME, "CLOCK_BOOTTIME", showRes); #endif exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBdate\fP(1), \fBgettimeofday\fP(2), \fBsettimeofday\fP(2), \fBtime\fP(2), \fBadjtime\fP(3), \fBclock_getcpuclockid\fP(3), \fBctime\fP(3), \fBftime\fP(3), \fBpthread_getcpuclockid\fP(3), \fBsysconf\fP(3), \fBtimespec\fP(3), \fBtime\fP(7), \fBtime_namespaces\fP(7), \fBvdso\fP(7), \fBhwclock\fP(8) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .