.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2001, Andries E. Brouwer .\" Copyright 2006, 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 makecontext 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم makecontext, swapcontext \- معالجة سياق المستخدم .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBvoid makecontext(ucontext_t *\fP\fIucp\fP\fB, typeof(void (int \fP\fIarg0\fP\fB, ...)) *\fP\fIfunc\fP\fB,\fP \fB int \fP\fIargc\fP\fB, ...);\fP \fBint swapcontext(ucontext_t *restrict \fP\fIoucp\fP\fB,\fP \fB const ucontext_t *restrict \fP\fIucp\fP\fB);\fP .fi .SH الوصف في بيئة شبيهة بـ System V، يوجد النوع \fIucontext_t\fP (المُعرَّف في \fI\fP والموصوف في \fBgetcontext\fP(3)) والدوال الأربع \fBgetcontext\fP(3) و\fBsetcontext\fP(3) و\fBmakecontext\fP() و\fBswapcontext\fP() التي تسمح بتبديل السياق على مستوى المستخدم بين خيوط تحكم متعددة داخل عملية. .P تعدّل الدالة \fBmakecontext\fP() السياق المُشار إليه بواسطة \fIucp\fP (الذي حُصِل عليه من استدعاء \fBgetcontext\fP(3)). قبل استدعاء \fBmakecontext\fP()، يجب على المستدعي تخصيص مكدس جديد لهذا السياق وتعيين عنوانه إلى \fIucp\->uc_stack\fP، وتعريف سياق خلف وتعيين عنوانه إلى \fIucp\->uc_link\fP. .P عند تفعيل هذا السياق لاحقًا (باستخدام \fBsetcontext\fP(3) أو \fBswapcontext\fP())، تُستدعى الدالة \fIfunc\fP وتُمرَّر إليها سلسلة وسائط الأعداد الصحيحة (\fIint\fP) التي تلي \fIargc\fP؛ يجب على المستدعي تحديد عدد هذه الوسائط في \fIargc\fP. عند عودة هذه الدالة، يُفعَّل السياق الخلف. إذا كان مؤشر السياق الخلف NULL، يخرج الخيط. .P تحفظ الدالة \fBswapcontext\fP() السياق الحالي في البنية المُشار إليها بواسطة \fIoucp\fP، ثم تُفعِّل السياق المُشار إليه بواسطة \fIucp\fP. .SH "قيمة الإرجاع" عند النجاح، لا تعود \fBswapcontext\fP(). (لكن قد نعود لاحقًا، في حالة تفعيل \fIoucp\fP، حيث يبدو أن \fBswapcontext\fP() تعيد 0.) عند الخطأ، تعيد \fBswapcontext\fP() \-1 وتضبط \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBENOMEM\fP مساحة مكدس متبقية غير كافية. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lb lb lbx l l l. الواجهة السمة القيمة T{ .na .nh \fBmakecontext\fP() T} سلامة الخيوط T{ .na .nh آمن للمسارات المتعددة (MT\-Safe) سباق:ucp T} T{ .na .nh \fBswapcontext\fP() T} سلامة الخيوط T{ .na .nh MT\-Safe race:oucp race:ucp T} .TE .SH المعايير لا شيء. .SH التاريخ glibc 2.1. SUSv2, POSIX.1\-2001. أُزيل في POSIX.1\-2008، مستشهدًا بمشاكل قابلية النقل، ويوصي بإعادة كتابة التطبيقات لاستخدام خيوط POSIX بدلاً من ذلك. .SH ملاحظات تفسير \fIucp\->uc_stack\fP هو تمامًا كما في \fBsigaltstack\fP(2)، أي أن هذه البنية تحتوي على بداية وطول منطقة ذاكرة لتُستخدم كمكدس، بغض النظر عن اتجاه نمو المكدس. وبالتالي، ليس من الضروري لبرنامج المستخدم القلق بشأن هذا الاتجاه. .P في البنى حيث \fIint\fP وأنواع المؤشرات بنفس الحجم (مثل x86\-32، حيث كلا النوعين 32 بت)، قد تتمكن من تمرير المؤشرات كوسائط إلى \fBmakecontext\fP() بعد \fIargc\fP. لكن، القيام بذلك غير مضمون ليكون محمولاً، وهو غير مُعرَّف وفقًا للمعايير، ولن يعمل في البنى حيث المؤشرات أكبر من \fIint\fP. ومع ذلك، بدءًا من glibc 2.8، أجرت glibc بعض التغييرات على \fBmakecontext\fP() للسماح بذلك في بعض البنى 64 بت (مثل x86\-64). .SH أمثلة يوضح برنامج المثال أدناه استخدام \fBgetcontext\fP(3) و\fBmakecontext\fP() و\fBswapcontext\fP(). يؤدي تشغيل البرنامج إلى إخراج التالي: .P .in +4n .EX $\fB ./a.out\fP main: swapcontext(&uctx_main, &uctx_func2) func2: started func2: swapcontext(&uctx_func2, &uctx_func1) func1: started func1: swapcontext(&uctx_func1, &uctx_func2) func2: returning func1: returning main: exiting .EE .in .SS "مصدر البرنامج" .\" SRC BEGIN (makecontext.c) \& .EX #include #include #include #include \& static ucontext_t uctx_main, uctx_func1, uctx_func2; \& static void func1(void) { printf("%s: started\[rs]n", __func__); printf("%s: swapcontext(&uctx_func1, &uctx_func2)\[rs]n", __func__); if (swapcontext(&uctx_func1, &uctx_func2) == \-1) err(EXIT_FAILURE, "swapcontext"); printf("%s: returning\[rs]n", __func__); } \& static void func2(void) { printf("%s: started\[rs]n", __func__); printf("%s: swapcontext(&uctx_func2, &uctx_func1)\[rs]n", __func__); if (swapcontext(&uctx_func2, &uctx_func1) == \-1) err(EXIT_FAILURE, "swapcontext"); printf("%s: returning\[rs]n", __func__); } \& int main(int argc, char *argv[]) { char func1_stack[16384]; char func2_stack[16384]; \& if (getcontext(&uctx_func1) == \-1) err(EXIT_FAILURE, "getcontext"); uctx_func1.uc_stack.ss_sp = func1_stack; uctx_func1.uc_stack.ss_size = sizeof(func1_stack); uctx_func1.uc_link = &uctx_main; makecontext(&uctx_func1, func1, 0); \& if (getcontext(&uctx_func2) == \-1) err(EXIT_FAILURE, "getcontext"); uctx_func2.uc_stack.ss_sp = func2_stack; uctx_func2.uc_stack.ss_size = sizeof(func2_stack); /* Successor context is f1(), unless argc > 1 */ uctx_func2.uc_link = (argc > 1) ? NULL : &uctx_func1; makecontext(&uctx_func2, func2, 0); \& printf("%s: swapcontext(&uctx_main, &uctx_func2)\[rs]n", __func__); if (swapcontext(&uctx_main, &uctx_func2) == \-1) err(EXIT_FAILURE, "swapcontext"); \& printf("%s: exiting\[rs]n", __func__); exit(EXIT_SUCCESS); } .EE .\" SRC END .SH "انظر أيضًا" \fBsigaction\fP(2), \fBsigaltstack\fP(2), \fBsigprocmask\fP(2), \fBgetcontext\fP(3), \fBsigsetjmp\fP(3) .PP .SH ترجمة تُرجمت هذه الصفحة من الدليل بواسطة زايد السعيدي . .PP هذه الترجمة هي وثيقة مجانية؛ راجع .UR https://www.gnu.org/licenses/gpl-3.0.html رخصة جنو العامة الإصدار 3 .UE أو ما بعده للاطلاع على شروط حقوق النشر. لا توجد أي ضمانات. .PP إذا وجدت أي أخطاء في ترجمة صفحة الدليل هذه، يرجى إرسال بريد إلكتروني إلى قائمة بريد المترجمين: .MT kde-l10n-ar@kde.org .ME .