.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2016, Michael Kerrisk .\" Copyright, the authors of the Linux man-pages project .\" .\" SPDX-License-Identifier: GPL-2.0-or-later .\" .\"******************************************************************* .\" .\" This file was generated with po4a. Translate the source file. .\" .\"******************************************************************* .TH setjmp 3 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم setjmp, sigsetjmp, longjmp, siglongjmp \- تنفيذ قفزة غير محلية .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint setjmp(jmp_buf \fP\fIenv\fP\fB);\fP \fBint sigsetjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIsavesigs\fP\fB);\fP .P \fB[[noreturn]] void longjmp(jmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP \fB[[noreturn]] void siglongjmp(sigjmp_buf \fP\fIenv\fP\fB, int \fP\fIval\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBsetjmp\fP(): انظر التاريخ. .P \fBsigsetjmp\fP(): .nf _POSIX_C_SOURCE .fi .SH الوصف تُستخدم الدوال الموصوفة في هذه الصفحة لتنفيذ "قفزات غير محلية": نقل التنفيذ من دالة إلى موقع محدد مسبقًا في دالة أخرى. تنشئ الدالة \fBsetjmp\fP() ديناميكيًا الهدف الذي سيُنقل إليه التحكم لاحقًا، وتنفذ الدالة \fBlongjmp\fP() نقل التنفيذ. .P تحفظ الدالة \fBsetjmp\fP() معلومات متنوعة عن بيئة الاستدعاء (عادةً، مؤشر المكدس، مؤشر التعليمات، وربما قيم سجلات أخرى وقناع الإشارة) في المخزن المؤقت \fIenv\fP لاستخدامها لاحقًا بواسطة \fBlongjmp\fP(). في هذه الحالة، تُرجع \fBsetjmp\fP() 0. .P تستخدم الدالة \fBlongjmp\fP() المعلومات المحفوظة في \fIenv\fP لإعادة التحكم إلى النقطة التي استُدعيت فيها \fBsetjmp\fP() واستعادة ("إرجاع") المكدس إلى حالته وقت استدعاء \fBsetjmp\fP(). بالإضافة إلى ذلك، واعتمادًا على التنفيذ (انظر الملاحظات والتاريخ)، قد تُستعاد قيم بعض السجلات الأخرى وقناع إشارة العملية إلى حالتها وقت استدعاء \fBsetjmp\fP(). .P بعد \fBlongjmp\fP() ناجحة، يستمر التنفيذ كما لو أن \fBsetjmp\fP() قد عادت مرة ثانية. يمكن تمييز هذا الإرجاع "المزيف" عن استدعاء \fBsetjmp\fP() حقيقي لأن الإرجاع "المزيف" يُرجع القيمة المقدمة في \fIval\fP. إذا مرر المبرمج القيمة 0 في \fIval\fP عن طريق الخطأ، فسيرجع الإرجاع "المزيف" 1 بدلاً من ذلك. .SS "sigsetjmp() و siglongjmp()" تنفذ \fBsigsetjmp\fP() و \fBsiglongjmp\fP() أيضًا قفزات غير محلية، لكنها توفر معالجة متوقعة لقناع إشارة العملية. .P إذا وفقط إذا كانت قيمة المعامل \fIsavesigs\fP المقدم إلى \fBsigsetjmp\fP() غير صفرية، يُحفظ قناع الإشارة الحالي للعملية في \fIenv\fP وسيُستعاد إذا نُفذت \fBsiglongjmp\fP() لاحقًا باستخدام هذا \fIenv\fP. .SH "قيمة الإرجاع" تُرجع \fBsetjmp\fP() و \fBsigsetjmp\fP() 0 عند استدعائهما مباشرة؛ عند الإرجاع "المزيف" الذي يحدث بعد \fBlongjmp\fP() أو \fBsiglongjmp\fP()، تُرجع القيمة غير الصفرية المحددة في \fIval\fP. .P لا تُرجع الدالتان \fBlongjmp\fP() أو \fBsiglongjmp\fP() أي قيمة. .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBsetjmp\fP()، \fBsigsetjmp\fP() T} سلامة الخيوط MT\-Safe T{ .na .nh \fBlongjmp\fP()، \fBsiglongjmp\fP() T} سلامة الخيوط MT\-Safe .TE .SH المعايير .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() C11, POSIX.1\-2008. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2008. .SH التاريخ .TP \fBsetjmp\fP() .TQ \fBlongjmp\fP() POSIX.1\-2001، C89. .TP \fBsigsetjmp\fP() .TQ \fBsiglongjmp\fP() POSIX.1\-2001. .P .\" so that _FAVOR_BSD is triggered .\" .BR _XOPEN_SOURCE_EXTENDED , لا يُحدد POSIX ما إذا كانت \fBsetjmp\fP() ستحفظ قناع الإشارة (لاستعادته لاحقًا أثناء \fBlongjmp\fP()). في System V لن تفعل. في 4.3BSD ستفعل، وهناك دالة \fB_setjmp\fP() لن تفعل. يعتمد السلوك تحت Linux على إصدار glibc وإعداد وحدات اختبار الميزات. قبل glibc 2.19، تتبع \fBsetjmp\fP() سلوك System V مبدئيًا، ولكن يُوفر سلوك BSD إذا تم تعريف وحدة اختبار الميزات \fB_BSD_SOURCE\fP صراحةً ولم يتم تعريف أي من \fB_POSIX_SOURCE\fP أو \fB_POSIX_C_SOURCE\fP أو \fB_XOPEN_SOURCE\fP أو \fB_GNU_SOURCE\fP أو \fB_SVID_SOURCE\fP. منذ glibc 2.19، يُظهر \fI\fP فقط إصدار System V من \fBsetjmp\fP(). يجب على البرامج التي تحتاج دلالات BSD استبدال استدعاءات \fBsetjmp\fP() باستدعاءات \fBsigsetjmp\fP() مع معامل \fIsavesigs\fP غير صفري. .SH ملاحظات يمكن أن تكون \fBsetjmp\fP() و \fBlongjmp\fP() مفيدة للتعامل مع الأخطاء داخل استدعاءات دوال متداخلة بعمق أو للسماح لمعالج إشارة بتمرير التحكم إلى نقطة محددة في البرنامج، بدلاً من العودة إلى النقطة التي قاطع فيها المعالج البرنامج الرئيس. في الحالة الأخيرة، إذا أردت حفظ واستعادة أقنعة الإشارة بشكل محمول، استخدم \fBsigsetjmp\fP() و \fBsiglongjmp\fP(). انظر أيضًا مناقشة قابلية قراءة البرنامج أدناه. .SH تحذيرات قد يُحسّن المترجم المتغيرات إلى سجلات، وقد تستعيد \fBlongjmp\fP() قيم سجلات أخرى بالإضافة إلى مؤشر المكدس وعداد البرنامج. وبالتالي، تكون قيم المتغيرات التلقائية غير محددة بعد استدعاء \fBlongjmp\fP() إذا استوفت جميع المعايير التالية: .IP \[bu] 3 هي محلية للدالة التي أجرت استدعاء \fBsetjmp\fP() المقابل؛ .IP \[bu] تتغير قيمها بين استدعاءات \fBsetjmp\fP() و \fBlongjmp\fP()؛ و .IP \[bu] لم تُصرّح على أنها \fIvolatile\fP. .P .\" تنطبق ملاحظات مماثلة على \fBsiglongjmp\fP(). .SS "القفزات غير المحلية وقابلية قراءة البرنامج" بينما يمكن إساءة استخدامها، فإن عبارة C التقليدية "goto" لها على الأقل فائدة أن الإشارات المعجمية (عبارة goto والعلامة الهدف) تسمح للمبرمج بإدراك تدفق التحكم بسهولة. لا توفر القفزات غير المحلية مثل هذه الإشارات: قد تستخدم استدعاءات \fBsetjmp\fP() المتعددة نفس متغير \fIjmp_buf\fP بحيث قد يتغير محتوى المتغير على مدى عمر التطبيق. وبالتالي، قد يُجبر المبرمج على قراءة مفصلة للكود لتحديد الهدف الديناميكي لاستدعاء \fBlongjmp\fP() معين. (لتسهيل حياة المبرمج، يجب أن يستخدم كل استدعاء \fBsetjmp\fP() متغير \fIjmp_buf\fP فريدًا.) .P مما يزيد الصعوبة، قد لا تكون استدعاءات \fBsetjmp\fP() و \fBlongjmp\fP() حتى في نفس وحدة الكود المصدري. .P .\" باختصار، يمكن للقفزات غير المحلية أن تجعل البرامج أصعب في الفهم والصيانة، ويجب استخدام بديل إذا أمكن. .SS "سلوك غير محدد" إذا عادت الدالة التي استدعت \fBsetjmp\fP() قبل استدعاء \fBlongjmp\fP()، يكون السلوك غير محدد. من المؤكد أن ينتج نوع من الفوضى الخفية أو الواضحة. .P .\" .\" The following statement appeared in versions up to POSIX.1-2008 TC1, .\" but is set to be removed in POSIX.1-2008 TC2: .\" .\" According to POSIX.1, if a .\" .BR longjmp () .\" call is performed from a nested signal handler .\" (i.e., from a handler that was invoked in response to a signal that was .\" generated while another signal was already in the process of being .\" handled), the behavior is undefined. إذا، في برنامج متعدد الخيوط، استخدم استدعاء \fBlongjmp\fP() مخزن \fIenv\fP مؤقتًا تمت تهيئته بواسطة استدعاء \fBsetjmp\fP() في خيط مختلف، يكون السلوك غير محدد. .P .\" http://austingroupbugs.net/view.php?id=516#c1195 يضيف التصحيح التقني POSIX.1\-2008 رقم 2 \fBlongjmp\fP() و \fBsiglongjmp\fP() إلى قائمة الدوال الآمنة للإشارات غير المتزامنة. ومع ذلك، يوصي المعيار بتجنب استخدام هذه الدوال من معالجات الإشارات ويستمر في الإشارة إلى أنه إذا تم استدعاء هذه الدوال من معالج إشارة قاطع استدعاءًا لدالة غير آمنة للإشارات غير المتزامنة (أو ما يعادله، مثل الخطوات المكافئة لـ \fBexit\fP(3) التي تحدث عند العودة من الاستدعاء الأولي لـ \fImain\fP())، يكون السلوك غير محدد إذا أجرى البرنامج لاحقًا استدعاءًا لدالة غير آمنة للإشارات غير المتزامنة. الطريقة الوحيدة لتجنب السلوك غير المحدد هي ضمان أحد ما يلي: .IP \[bu] 3 بعد القفز الطويل من معالج الإشارة، لا يستدعي البرنامج أي دوال غير آمنة للإشارات غير المتزامنة ولا يعود من الاستدعاء الأولي لـ \fImain\fP(). .IP \[bu] يجب حظر أي إشارة يقوم معالجها بقفزة طويلة أثناء \fIكل\fP استدعاء لدالة غير آمنة للإشارات غير المتزامنة ولا تُستدعى دوال غير آمنة للإشارات غير المتزامنة بعد العودة من الاستدعاء الأولي لـ \fImain\fP(). .SH "انظر أيضًا" \fBsignal\fP(7), \fBsignal\-safety\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 .