الأوقات(2)

الاسم
times - الحصول على أزمنة العملية

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <sys/times.h>

clock_t times(struct tms *buf);

الوصف
تخزن times() أزمنة العملية الحالية في struct tms الذي يشير إليه buf. يُعرّف struct tms كما في <sys/times.h>:

    struct tms {
        clock_t tms_utime;  /* زمن المستخدم */
        clock_t tms_stime;  /* زمن النظام */
        clock_t tms_cutime; /* زمن المستخدم للعمليات الابنة */
        clock_t tms_cstime; /* زمن النظام للعمليات الابنة */
    };

يحتوي الحقل tms_utime على زمن وحدة المعالجة المركزية (CPU) المنفق في تنفيذ تعليمات العملية المستدعية. يحتوي الحقل tms_stime على زمن CPU المنفق في التنفيذ داخل النواة أثناء أداء مهام نيابة عن العملية المستدعية.

يحتوي الحقل tms_cutime على مجموع قيم tms_utime و tms_cutime لجميع العمليات الابنة المنتهية التي انتظرتها العملية. يحتوي الحقل tms_cstime على مجموع قيم tms_stime و tms_cstime لجميع العمليات الابنة المنتهية التي انتظرتها العملية.

تُضاف أزمنة العمليات الابنة المنتهية (وسلالاتها) في اللحظة التي يُرجع فيها wait(2) أو waitpid(2) معرف العملية الخاص بها. على وجه الخصوص، لا تُرى أبدًا أزمنة الأحفاد الذين لم تنتظرهم العمليات الابنة.

جميع الأزمنة المبلغ عنها تكون بوحدات النبضات (clock ticks).

قيمة الإرجاع
تُرجع times() عدد النبضات التي انقضت منذ نقطة عشوائية في الماضي. قد تفيض القيمة المُرجعة عن النطاق الممكن للنوع clock_t. عند حدوث خطأ، تُرجع (clock_t) -1، ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EFAULT
    يشير tms إلى خارج مساحة عنوان العملية.

الإصدارات
في لينكس، يمكن تحديد الوسيط buf كقيمة NULL، مما يؤدي إلى أن times() تُرجع فقط نتيجة الدالة. ومع ذلك، لا يحدد POSIX هذا السلوك، وتتطلب معظم تطبيقات UNIX الأخرى قيمة غير NULL لـ buf.

المعايير
POSIX.1-2024.

التاريخ
POSIX.1-2001، SVr4، 4.3BSD.

في POSIX.1-1996، يُذكر الرمز CLK_TCK (المُعرّف في <time.h>) كمهمل. وهو مهمل الآن.

قبل لينكس 2.6.9، إذا ضُبط تصرف SIGCHLD على SIG_IGN، فإن أزمنة العمليات الابنة المنتهية تُضمّن آليًا في الحقلين tms_cstime و tms_cutime، على الرغم من أن POSIX.1-2001 ينص على أن هذا يجب أن يحدث فقط إذا استخدمت العملية المستدعية wait(2) على أبنائها. صُحح هذا عدم الامتثال في لينكس 2.6.9 والإصدارات الأحدث.

في لينكس، تختلف “النقطة العشوائية في الماضي” التي يُقاس منها القيمة المُرجعة لـ times() عبر إصدارات النواة. في لينكس 2.4 والإصدارات الأقدم، هذه النقطة هي لحظة إقلاع النظام. منذ لينكس 2.6، هذه النقطة هي (2^32/HZ) - 300 ثانية قبل وقت إقلاع النظام. هذا التباين عبر إصدارات النواة (وعبر تطبيقات UNIX)، بالإضافة إلى حقيقة أن القيمة المُرجعة قد تفيض عن نطاق clock_t، يعني أن التطبيق المحمول سيكون من الحكمة تجنب استخدام هذه القيمة. لقياس التغييرات في الوقت المنقضي، استخدم clock_gettime(2) بدلاً من ذلك.

تُرجع SVr1-3 النوع long وأعضاء الهيكل من النوع time_t على الرغم من أنها تخزن نبضات، وليس ثوانٍ منذ العصر (Epoch). استخدم V7 النوع long لأعضاء الهيكل، لأنه لم يكن لديه النوع time_t بعد.

ملاحظات
يمكن الحصول على عدد النبضات في الثانية باستخدام:

    sysconf(_SC_CLK_TCK);

لاحظ أن clock(3) تُرجع أيضًا قيمة من النوع clock_t، ولكن هذه القيمة تُقاس بوحدات CLOCKS_PER_SEC، وليس النبضات التي تستخدمها times().

العلل
يعني قيد في اصطلاحات استدعاءات نظام لينكس على بعض البنى (خاصة i386) أنه على لينكس 2.6 توجد نافذة زمنية صغيرة (41 ثانية) بعد الإقلاع مباشرة حيث يمكن لـ times() أن تُرجع -1، مما يشير خطأً إلى حدوث خطأ. يمكن أن تحدث نفس المشكلة عندما تلف القيمة المُرجعة متجاوزة القيمة القصوى التي يمكن تخزينها في clock_t.

انظر أيضًا
time(1), getrusage(2), wait(2), clock(3), sysconf(3), time(7)

ترجمة
تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي <zayed.alsaidi@gmail.com>

هذه الترجمة هي وثيقة مجانية؛ راجع رخصة جنو العامة الإصدار 3 (https://www.gnu.org/licenses/gpl-3.0.html) أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات.

إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: kde-l10n-ar@kde.org.