.\" -*- coding: UTF-8 -*- '\" t .\" Copyright 2001-2017, 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 sigaltstack 2 "8 فبراير 2026" "صفحات دليل لينكس 6.18" .SH الاسم sigaltstack \- ضبط و/أو الحصول على سياق كومة الإشارة .SH المكتبة مكتبة سي المعيارية (\fIlibc\fP،\ \fI\-lc\fP) .SH موجز .nf \fB#include \fP .P \fBint sigaltstack(const stack_t *_Nullable restrict \fP\fIss\fP\fB,\fP \fB stack_t *_Nullable restrict \fP\fIold_ss\fP\fB);\fP .fi .P .RS -4 متطلبات ماكروات اختبار الميزات لـ glibc (انظر \fBfeature_test_macros\fP(7)): .RE .P \fBsigaltstack\fP(): .nf .\" || _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED _XOPEN_SOURCE >= 500 || /* منذ glibc 2.12: */ _POSIX_C_SOURCE >= 200809L || /* glibc <= 2.19: */ _BSD_SOURCE .fi .SH الوصف تسمح \fBsigaltstack\fP() لسلسلة تنفيذ بتعريف كومة إشارة بديلة جديدة و/أو استرداد حالة كومة إشارة بديلة موجودة. تُستخدم كومة الإشارة البديلة أثناء تنفيذ معالج إشارة إذا طلب إنشاء ذلك المعالج (انظر \fBsigaction\fP(2)) ذلك. .P التسلسل الطبيعي للأحداث لاستخدام كومة إشارة بديلة هو التالي: .TP 3 1. تخصيص منطقة ذاكرة لاستخدامها ككومة إشارة بديلة. .TP 2. استخدام \fBsigaltstack\fP() لإعلام النظام بوجود وموقع كومة الإشارة البديلة. .TP 3. عند إنشاء معالج إشارة باستخدام \fBsigaction\fP(2)، إعلام النظام بأنه يجب تنفيذ معالج الإشارة على كومة الإشارة البديلة بتحديد العلم \fBSA_ONSTACK\fP. .P تُستخدم الوسيطة \fIss\fP لتحديد كومة إشارة بديلة جديدة، بينما تُستخدم الوسيطة \fIold_ss\fP لاسترداد معلومات حول كومة الإشارة المنشأة حاليًا. إذا كنا مهتمين بأداء مهمة واحدة فقط من هذه المهام، فيمكن تحديد الوسيطة الأخرى كـ NULL. .P النوع \fIstack_t\fP المستخدم لكتابة وسائط هذه الدالة يُعرف كما يلي: .P .in +4n .EX typedef struct { void *ss_sp; /* Base address of stack */ int ss_flags; /* Flags */ size_t ss_size; /* Number of bytes in stack */ } stack_t; .EE .in .P لإنشاء كومة إشارة بديلة جديدة، تُضبط حقول هذه البنية كما يلي: .TP \fIss.ss_flags\fP يحتوي هذا الحقل إما على 0، أو العلم التالي: .RS .TP \fBSS_AUTODISARM\fP (منذ Linux 4.7) .\" commit 2a74213838104a41588d86fd5e8d344972891ace .\" See tools/testing/selftests/sigaltstack/sas.c in kernel sources مسح إعدادات كومة الإشارة البديلة عند الدخول إلى معالج الإشارة. عند عودة معالج الإشارة، تُستعاد إعدادات كومة الإشارة البديلة السابقة. .IP أُضيف هذا العلم لجعل التبديل بعيدًا عن معالج الإشارة باستخدام \fBswapcontext\fP(3) آمنًا. بدون هذا العلم، ستُفسد إشارة تُعالج لاحقًا حالة معالج الإشارة المُبدّل بعيدًا. على النوى التي لا يُدعم فيها هذا العلم، تفشل \fBsigaltstack\fP() مع الخطأ \fBEINVAL\fP عند توفير هذا العلم. .RE .TP \fIss.ss_sp\fP يحدد هذا الحقل عنوان بداية الكومة. عند استدعاء معالج إشارة على الكومة البديلة، يقوم النواة آليًا بمحاذاة العنوان المعطى في \fIss.ss_sp\fP إلى حد عنوان مناسب لبنية العتاد الأساسية. .TP \fIss.ss_size\fP يحدد هذا الحجم حجم الكومة. يُعرف الثابت \fBSIGSTKSZ\fP ليكون كبيرًا بما يكفي لتغطية متطلبات الحجم المعتادة لكومة إشارة بديلة، ويُعرف الثابت \fBMINSIGSTKSZ\fP الحد الأدنى للحجم المطلوب لتنفيذ معالج إشارة. .P لتعطيل كومة موجودة، حدد \fIss.ss_flags\fP كـ \fBSS_DISABLE\fP. في هذه الحالة، تتجاهل النواة أي أعلام أخرى في \fIss.ss_flags\fP والحقول المتبقية في \fIss\fP. .P إذا لم يكن \fIold_ss\fP NULL، فإنه يُستخدم لإرجاع معلومات حول كومة الإشارة البديلة التي كانت سارية قبل استدعاء \fBsigaltstack\fP(). يُرجع الحقلان \fIold_ss.ss_sp\fP و \fIold_ss.ss_size\fP عنوان البداية وحجم تلك الكومة. قد يُرجع \fIold_ss.ss_flags\fP إحدى القيم التالية: .TP \fBSS_ONSTACK\fP تنفذ سلسلة التنفيذ حاليًا على كومة الإشارة البديلة. (لاحظ أنه لا يمكن تغيير كومة الإشارة البديلة إذا كانت سلسلة التنفيذ تنفذ عليها حاليًا.) .TP \fBSS_DISABLE\fP كومة الإشارة البديلة معطلة حاليًا. .IP .\" FIXME Was it intended that one can set up a different alternative .\" signal stack in this scenario? (In passing, if one does this, the .\" sigaltstack(NULL, &old_ss) now returns old_ss.ss_flags==SS_AUTODISARM .\" rather than old_ss.ss_flags==SS_DISABLE. The API design here seems .\" confusing... بدلاً من ذلك، تُرجع هذه القيمة إذا كانت سلسلة التنفيذ تنفذ حاليًا على كومة إشارة بديلة أُنشئت باستخدام العلم \fBSS_AUTODISARM\fP. في هذه الحالة، من الآمن التبديل بعيدًا عن معالج الإشارة باستخدام \fBswapcontext\fP(3). من الممكن أيضًا إعداد كومة إشارة بديلة مختلفة باستخدام استدعاء إضافي لـ \fBsigaltstack\fP(). .TP \fBSS_AUTODISARM\fP تم وضع علامة على مكدس الإشارة البديل ليتم نزع سلاحه آليًا كما هو موصوف أعلاه. .P بتحديد \fIss\fP كقيمة NULL، و \fIold_ss\fP كقيمة غير NULL، يمكن للمرء الحصول على الإعدادات الحالية لمكدس الإشارة البديل دون تغييرها. .SH "قيمة الإرجاع" تُرجع \fBsigaltstack\fP() 0 عند النجاح، أو \-1 عند الفشل مع تعيين \fIerrno\fP للإشارة إلى الخطأ. .SH الأخطاء .TP \fBEFAULT\fP إما \fIss\fP أو \fIold_ss\fP ليس NULL ويشير إلى منطقة خارج نطاق عنوان العملية. .TP \fBEINVAL\fP \fIss\fP ليس NULL ويحتوي حقل \fIss_flags\fP على علامة غير صالحة. .TP \fBENOMEM\fP الحجم المحدد لمكدس الإشارة البديل الجديد \fIss.ss_size\fP كان أقل من \fBMINSIGSTKSZ\fP. .TP \fBEPERM\fP تمت محاولة تغيير مكدس الإشارة البديل بينما كان نشطًا (أي، كان الخيط ينفذ بالفعل على مكدس الإشارة البديل الحالي). .SH السمات للاطلاع على شرح للمصطلحات المستخدمة في هذا القسم، انظر \fBattributes\fP(7). .TS allbox; lbx lb lb l l l. الواجهة السمة القيمة T{ .na .nh \fBsigaltstack\fP() T} سلامة الخيوط MT\-Safe .TE .SH المعايير POSIX.1\-2024. .P \fBSS_AUTODISARM\fP هو امتداد لنظام لينكس. .SH التاريخ POSIX.1\-2001, SUSv2, SVr4. .SH ملاحظات الاستخدام الأكثر شيوعًا لمكدس الإشارة البديل هو معالجة إشارة \fBSIGSEGV\fP التي تُنشأ إذا استُنفدت المساحة المتاحة للمكدس القياسي: في هذه الحالة، لا يمكن استدعاء معالج إشارة لـ \fBSIGSEGV\fP على المكدس القياسي؛ إذا أردنا معالجتها، يجب استخدام مكدس إشارة بديل. .P إنشاء مكدس إشارة بديل مفيد إذا توقع خيط أنه قد يستنفد مكدسه القياسي. قد يحدث هذا، على سبيل المثال، لأن المكدس ينمو بشكل كبير لدرجة أنه يصطدم بالكومة المتنامية لأعلى، أو يصل إلى حد محدد بواسطة استدعاء \fI\%setrlimit(RLIMIT_STACK, &rlim)\fP. إذا استُنفد المكدس القياسي، ترسل النواة إشارة \fBSIGSEGV\fP إلى الخيط. في هذه الظروف، الطريقة الوحيدة لالتقاط هذه الإشارة هي على مكدس إشارة بديل. .P في معظم بنى العتاد التي يدعمها لينكس، تنمو المكدسات لأسفل. تراعي \fBsigaltstack\fP() آليًا اتجاه نمو المكدس. .P ستستخدم الدوال المُستدعاة من معالج إشارة ينفذ على مكدس إشارة بديل أيضًا مكدس الإشارة البديل. (ينطبق هذا أيضًا على أي معالجات تُستدعى لإشارات أخرى بينما ينفذ الخيط على مكدس الإشارة البديل.) على عكس المكدس القياسي، لا يقوم النظام بتمديد مكدس الإشارة البديل آليًا. تجاوز الحجم المخصص لمكدس الإشارة البديل سيؤدي إلى نتائج غير متوقعة. .P يزيل استدعاء ناجح لـ \fBexecve\fP(2) أي مكدس إشارة بديل موجود. ترث عملية فرعية مُنشأة عبر \fBfork\fP(2) نسخة من إعدادات مكدس الإشارة البديل لأبويها. وينطبق الشيء نفسه على عملية فرعية مُنشأة باستخدام \fBclone\fP(2)، ما لم تتضمن أعلام clone \fBCLONE_VM\fP ولا تتضمن \fBCLONE_VFORK\fP، وفي هذه الحالة يتم تعطيل أي مكدس إشارة بديل تم إنشاؤه في العملية الأم في العملية الفرعية. .P تحل \fBsigaltstack\fP() محل الاستدعاء الأقدم \fBsigstack\fP(). للتوافق مع الإصدارات السابقة، توفر glibc أيضًا \fBsigstack\fP(). يجب كتابة جميع التطبيقات الجديدة باستخدام \fBsigaltstack\fP(). .SS السجل كان لدى 4.2BSD استدعاء نظام \fBsigstack\fP(). استخدم هيكلًا مختلفًا قليلاً، وكان له عيب رئيسي وهو أن المُستدعي كان عليه معرفة اتجاه نمو المكدس. .SH العلل .\" Linux 2.3.40 .\" After quite a bit of web and mail archive searching, .\" I could not find the patch on any mailing list, and I .\" could find no place where the rationale for this change .\" explained -- mtk .\" See the source code of Illumos and FreeBSD, for example. في لينكس 2.2 والإصدارات الأقدم، كانت العلامة الوحيدة التي يمكن تحديدها في \fIss.sa_flags\fP هي \fBSS_DISABLE\fP. في الفترة التي سبقت إصدار نواة لينكس 2.4، تم إجراء تغيير للسماح لـ \fBsigaltstack\fP() بالسماح بـ \fIss.ss_flags==SS_ONSTACK\fP بنفس معنى \fIss.ss_flags==0\fP (أي، إدراج \fBSS_ONSTACK\fP في \fIss.ss_flags\fP هو عملية لا تأثير لها). في التطبيقات الأخرى، ووفقًا لـ POSIX.1، يظهر \fBSS_ONSTACK\fP فقط كعلامة مُبلغ عنها في \fIold_ss.ss_flags\fP. في لينكس، ليست هناك حاجة أبدًا لتحديد \fBSS_ONSTACK\fP في \fIss.ss_flags\fP، وفي الواقع يجب تجنب ذلك لأسباب تتعلق بقابلية النقل: تعطي العديد من الأنظمة الأخرى خطأً إذا تم تحديد \fBSS_ONSTACK\fP في \fIss.ss_flags\fP. .SH أمثلة يوضح مقطع الكود التالي استخدام \fBsigaltstack\fP() (و \fBsigaction\fP(2)) لتثبيت مكدس إشارة بديل يستخدمه معالج إشارة \fBSIGSEGV\fP: .P .in +4n .EX stack_t ss; \& ss.ss_sp = malloc(SIGSTKSZ); if (ss.ss_sp == NULL) { perror("malloc"); exit(EXIT_FAILURE); } \& ss.ss_size = SIGSTKSZ; ss.ss_flags = 0; if (sigaltstack(&ss, NULL) == \-1) { perror("sigaltstack"); exit(EXIT_FAILURE); } \& sa.sa_flags = SA_ONSTACK; sa.sa_handler = handler(); /* Address of a signal handler */ sigemptyset(&sa.sa_mask); if (sigaction(SIGSEGV, &sa, NULL) == \-1) { perror("sigaction"); exit(EXIT_FAILURE); } .EE .in .SH "انظر أيضًا" \fBexecve\fP(2), \fBsetrlimit\fP(2), \fBsigaction\fP(2), \fBsiglongjmp\fP(3), \fBsigsetjmp\fP(3), \fBsignal\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 .