pthread_attr_setguardsize(3)

الاسم
pthread_attr_setguardsize, pthread_attr_getguardsize - تعيين/الحصول على سمة حجم الحارس في كائن سمات الخيط

المكتبة
مكتبة مسالك POSIX (libpthread، -lpthread)

موجز
#include <pthread.h>

int pthread_attr_setguardsize(pthread_attr_t *attr, size_t guardsize);
int pthread_attr_getguardsize(const pthread_attr_t *restrict attr,
                              size_t *restrict guardsize);

الوصف
تضبط الدالة pthread_attr_setguardsize() سمة حجم الحارس لكائن سمات الخيط المشار إليه بواسطة attr إلى القيمة المحددة في guardsize.

إذا كان guardsize أكبر من 0، فإنه لكل خيط جديد يُنشأ باستخدام attr يخصص النظام منطقة إضافية بحجم لا يقل عن guardsize بايت في نهاية مكدس الخيط لتكون منطقة حارس للمكدس (لكن انظر الأخطاء).

إذا كان guardsize يساوي 0، فإن الخيوط الجديدة المنشأة باستخدام attr لن تحتوي على منطقة حارس.

حجم الحارس المبدئي هو نفس حجم صفحة النظام.

إذا تم تعيين سمة عنوان المكدس في attr (باستخدام pthread_attr_setstack(3) أو pthread_attr_setstackaddr(3))، مما يعني أن المستدعي يخصص مكدس الخيط، فإن سمة حجم الحارس تُتجاهل (أي لا تُنشأ منطقة حارس بواسطة النظام): تقع مسؤولية معالجة تجاوز سعة المكدس على عاتق التطبيق (ربما باستخدام mprotect(2) لتعريف منطقة حارس يدويًا في نهاية المكدس الذي خصصه).

تُرجع الدالة pthread_attr_getguardsize() سمة حجم الحارس لكائن سمات الخيط المشار إليه بواسطة attr في المخزن المؤقت المشار إليه بواسطة guardsize.

قيمة الإرجاع
عند النجاح، تُعيد هذه الدوال القيمة 0؛ وعند الخطأ، تُعيد رقم خطأ غير صفري.

الأخطاء
يوثق POSIX.1 خطأ EINVAL إذا كان attr أو guardsize غير صالح. على لينكس تنجح هذه الدوال دائمًا (لكن التطبيقات المحمولة والمقاومة للمستقبل يجب أن تتعامل مع إرجاع خطأ محتمل).

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

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

التاريخ
glibc 2.1. POSIX.1-2001.

ملاحظات
تتكون منطقة الحارس من صفحات ذاكرة افتراضية محمية لمنع الوصول للقراءة والكتابة. إذا تجاوز خيط مكدسه إلى منطقة الحارس، فإنه، على معظم البنى الصلبة، يستقبل إشارة SIGSEGV، مما يخبره بالتجاوز. تبدأ مناطق الحارس على حدود الصفحات، ويُقرّب حجم الحارس داخليًا إلى حجم صفحة النظام عند إنشاء خيط. (مع ذلك، تُرجع pthread_attr_getguardsize() حجم الحارس الذي تم تعيينه بواسطة pthread_attr_setguardsize().)

قد يكون تعيين حجم حارس بقيمة 0 مفيدًا لتوفير الذاكرة في تطبيق ينشئ العديد من الخيوط ويعلم أن تجاوز سعة المكدس لا يمكن أن يحدث أبدًا.

قد يكون اختيار حجم حارس أكبر من الحجم المبدئي ضروريًا لاكتشاف تجاوزات سعة المكدس إذا خصص خيط هياكل بيانات كبيرة على المكدس.

العلل
اعتبارًا من glibc 2.8، يتضمن تنفيذ الخيوط NPTL منطقة الحارس ضمن تخصيص حجم المكدس، بدلاً من تخصيص مساحة إضافية في نهاية المكدس، كما يتطلب POSIX.1. (يمكن أن يؤدي هذا إلى خطأ EINVAL من pthread_create(3) إذا كانت قيمة حجم الحارس كبيرة جدًا، مما لا يترك مساحة للمكدس الفعلي.)

قام تنفيذ LinuxThreads القديم بالشيء الصحيح، بتخصيص مساحة إضافية في نهاية المكدس لمنطقة الحارس.

أمثلة
انظر pthread_getattr_np(3).

انظر أيضًا
mmap(2)، mprotect(2)، pthread_attr_init(3)، pthread_attr_setstack(3)، pthread_attr_setstacksize(3)، pthread_create(3)، pthreads(7)

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

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

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