getcontext(3)

الاسم
getcontext, setcontext - الحصول على سياق المستخدم أو تعيينه

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

موجز
#include <ucontext.h>

int getcontext(ucontext_t *ucp);
int setcontext(const ucontext_t *ucp);

الوصف
في بيئة شبيهة بـ System V، يوجد نوعان mcontext_t و ucontext_t مُعرَّفان في <ucontext.h> وأربع دوال getcontext() و setcontext() و makecontext(3) و swapcontext(3) التي تسمح بتبديل السياق على مستوى المستخدم بين عدة مسارات تحكم داخل عملية.

النوع mcontext_t يعتمد على الآلة وهو معتم. النوع ucontext_t هو بنية تحتوي على الأقل على الحقول التالية:

    typedef struct ucontext_t {
        struct ucontext_t *uc_link;
        sigset_t          uc_sigmask;
        stack_t           uc_stack;
        mcontext_t        uc_mcontext;
        ...
    } ucontext_t;

مع sigset_t و stack_t المُعرَّفين في <signal.h>. هنا uc_link يشير إلى السياق الذي سيُستأنف عندما ينتهي السياق الحالي (في حال كان السياق الحالي قد أُنشئ باستخدام makecontext(3))، و uc_sigmask هو مجموعة الإشارات المحجوبة في هذا السياق (انظر sigprocmask(2))، و uc_stack هو المكدس المستخدم بواسطة هذا السياق (انظر sigaltstack(2))، و uc_mcontext هو التمثيل الخاص بالآلة للسياق المحفوظ، والذي يتضمن سجلات الآلة لمسلك الاستدعاء.

الدالة getcontext() تُهيئ البنية المشار إليها بواسطة ucp إلى السياق النشط حاليًا.

الدالة setcontext() تستعيد سياق المستخدم المشار إليه بواسطة ucp. الاستدعاء الناجح لا يعود. يجب أن يكون السياق قد حُصل عليه باستدعاء getcontext() أو makecontext(3) أو استُلم كوسيطة ثالثة لمعالج إشارة (انظر مناقشة العلم SA_SIGINFO في sigaction(2)).

إذا حُصل على السياق باستدعاء getcontext()، يستمر تنفيذ البرنامج كما لو أن هذا الاستدعاء قد عاد للتو.

إذا حُصل على السياق باستدعاء makecontext(3)، يستمر تنفيذ البرنامج باستدعاء الدالة func المُحددة كوسيطة ثانية لذلك الاستدعاء لـ makecontext(3). عندما تعود الدالة func، نستمر مع العضو uc_link من البنية ucp المُحددة كوسيطة أولى لذلك الاستدعاء لـ makecontext(3). عندما يكون هذا العضو NULL، يخرج المسلك.

إذا حُصل على السياق باستدعاء معالج إشارة، فإن النص القياسي القديم يقول أن "تنفيذ البرنامج يستمر مع تعليمة البرنامج التالية للتعليمة التي قاطعتها الإشارة". ومع ذلك، أُزيلت هذه الجملة في SUSv2، والحكم الحالي هو "النتيجة غير محددة".

قيمة الإرجاع
عند النجاح، تُرجع getcontext() 0 و setcontext() لا تعود. عند الخطأ، يُرجع كلاهما -1 ويُعيّنان errno للإشارة إلى الخطأ.

الأخطاء
لا شيء مُعرَّف.

السمات
للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر attributes(7).
الواجهة | السمة | القيمة
getcontext()، setcontext() | سلامة الخيوط | آمن للمسارات المتعددة (MT-Safe) سباق:ucp

المعايير
لا شيء.

التاريخ
SUSv2، POSIX.1-2001.

يزيل POSIX.1-2008 هذه الدوال، مستشهدًا بمشاكل قابلية النقل، ويوصي بإعادة كتابة التطبيقات لاستخدام مسالك POSIX بدلاً من ذلك.

ملاحظات
كان التجسيد الأقدم لهذه الآلية هو آلية setjmp(3)/ longjmp(3). نظرًا لأن ذلك لا يُعرِّف معالجة سياق الإشارة، كانت المرحلة التالية هي الزوج sigsetjmp(3)/ siglongjmp(3). الآلية الحالية تعطي تحكمًا أكبر بكثير. من ناحية أخرى، لا توجد طريقة سهلة لاكتشاف ما إذا كانت العودة من getcontext() هي من الاستدعاء الأول، أو عبر استدعاء setcontext(). يجب على المستخدم اختراع أداة حفظ سجلات خاصة به، والمتغير المسجل لن يفي بالغرض لأن السجلات تُستعاد.

عند حدوث إشارة، يُحفظ سياق المستخدم الحالي ويُنشأ سياق جديد بواسطة النواة لمعالج الإشارة. لا تترك المعالج باستخدام longjmp(3): غير محدد ما سيحدث مع السياقات. استخدم siglongjmp(3) أو setcontext() بدلاً من ذلك.

انظر أيضًا
sigaction(2)، sigaltstack(2)، sigprocmask(2)، longjmp(3)، makecontext(3)، sigsetjmp(3)، signal(7)

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

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

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