سمات(7)

الاسم
attributes - مفاهيم السلامة في POSIX

الوصف
ملاحظة: نص صفحة الدليل هذه مبني على المادة المأخوذة من قسم "مفاهيم السلامة في POSIX" من دليل مكتبة GNU C. يمكن العثور على تفاصيل إضافية حول الموضوعات الموصوفة هنا في ذلك الدليل.

تتضمن صفحات دليل الدوال المختلفة قسماً بعنوان ATTRIBUTES يصف سلامة استدعاء الدالة في سياقات مختلفة. يقوم هذا القسم بتعليق الدوال بعلامات السلامة التالية:

MT-Safe
    الدوال الآمنة للخيوط أو Thread-Safe آمنة للاستدعاء في وجود خيوط أخرى. MT في MT-Safe ترمز إلى Multi Thread (خيوط متعددة).

    كون الدالة آمنة للخيوط لا يعني أنها ذرية، ولا أنها تستخدم أي آليات مزامنة للذاكرة التي يعرضها POSIX للمستخدمين. حتى أنه من الممكن أن استدعاء دوال آمنة للخيوط بالتسلسل لا ينتج عنه تركيبة آمنة للخيوط. على سبيل المثال، جعل خيط يستدعي دالتين آمنتين للخيوط واحدة تلو الأخرى لا يضمن سلوكاً مكافئاً للتنفيذ الذري لتركيبة كلتا الدالتين، لأن الاستدعاءات المتزامنة في خيوط أخرى قد تتداخل بطريقة مدمرة.

    تحسينات البرنامج الكامل التي قد تقوم بتضمين الدوال عبر واجهات المكتبة قد تعرض إعادة ترتيب غير آمنة، ولذا لا يُوصى بإجراء التضمين عبر واجهة مكتبة GNU C. حالة الأمان للخيوط الموثقة غير مضمونة تحت تحسين البرنامج الكامل. ومع ذلك، فإن الدوال المعرفة في ملفات الرأس المرئية للمستخدم مصممة لتكون آمنة للتضمين.

MT-Unsafe
    الدوال غير الآمنة للخيوط ليست آمنة للاستدعاء في برامج متعددة الخيوط.

الكلمات المفتاحية الأخرى التي تظهر في ملاحظات السلامة تُعرف في الأقسام اللاحقة.

  الميزات الآمنة بشروط
بالنسبة لبعض الميزات التي تجعل الدوال غير آمنة للاستدعاء في سياقات معينة، هناك طرق معروفة لتجنب مشكلة السلامة بخلاف الامتناع عن استدعاء الدالة بالكامل. تشير الكلمات المفتاحية التالية إلى هذه الميزات، ويشير كل تعريف منها إلى كيفية تقييد البرنامج الكامل لإزالة مشكلة السلامة المشار إليها بالكلمة المفتاحية. فقط عندما يتم ملاحظة ومعالجة جميع الأسباب التي تجعل الدالة غير آمنة، من خلال تطبيق القيود الموثقة، تصبح الدالة آمنة للاستدعاء في سياق ما.

init
    الدوال الموسومة بـ init كميزة غير آمنة للخيوط تقوم بتهيئة غير آمنة للخيوط عند استدعائها لأول مرة.

    استدعاء هذه الدالة مرة واحدة على الأقل في وضع الخيط الواحد يزيل هذا السبب المحدد لاعتبار الدالة غير آمنة للخيوط. إذا لم يبق سبب آخر لذلك، يمكن عندها استدعاء الدالة بأمان بعد بدء الخيوط الأخرى.

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

const
    الدوال الموسومة بـ const كمشكلة أمان للخيوط تقوم بتعديل كائنات داخلية بشكل غير ذري يُفضل اعتبارها ثابتة، لأن جزءاً كبيراً من مكتبة GNU C يصل إليها دون مزامنة. على عكس race، الذي يتسبب في اعتبار كل من قارئي وكاتبي الكائنات الداخلية غير آمنين للخيوط، يتم تطبيق هذه العلامة على الكُتّاب فقط. يظل الكُتّاب غير آمنين للاستدعاء، لكن الثبات الإجباري للكائنات التي يعدلونها يمكن القُرّاء من اعتبارهم آمنين للخيوط (طالما لم تبق أسباب أخرى لعدم أمانهم)، لأن غياب المزامنة ليس مشكلة عندما تكون الكائنات ثابتة فعلياً.

    المُعرّف الذي يتبع علامة const سيظهر بمفرده كملاحظة سلامة في القُرّاء. البرامج التي ترغب في تجاوز مشكلة السلامة هذه، لاستدعاء الكُتّاب، قد تستخدم قفل قراءة-كتابة غير استرجاعي مرتبط بالمُعرّف، وتحمي جميع الاستدعاءات للدوال الموسومة بـ const متبوعة بالمُعرّف بقفل كتابة، وجميع الاستدعاءات للدوال الموسومة بالمُعرّف بمفرده بقفل قراءة.

sig الدوال الموسومة بـ sig كمشكلة أمان للخيوط قد تقوم بتثبيت معالج إشارة مؤقتاً لأغراض داخلية، مما قد يتداخل مع الاستخدامات الأخرى للإشارة، المُعرّفة بعد نقطتين.

    يمكن تجاوز مشكلة السلامة هذه بضمان عدم حدوث استخدامات أخرى للإشارة طوال مدة الاستدعاء. يُوصى بحمل كائن مزامنة (mutex) غير استرجاعي أثناء استدعاء جميع الدوال التي تستخدم نفس الإشارة المؤقتة؛ وحظر تلك الإشارة قبل الاستدعاء وإعادة تعيين معالجها بعده.

term
    الدوال الموسومة بـ term كمشكلة أمان للخيوط قد تغير إعدادات الطرفية بالطريقة الموصى بها، وهي: استدعاء tcgetattr(3)، تعديل بعض الأعلام، ثم استدعاء tcsetattr(3)، مما يخلق نافذة يتم فيها فقدان التغييرات التي أجرتها خيوط أخرى. وبالتالي، الدوال الموسومة بـ term غير آمنة للخيوط.

    لذا يُنصح التطبيقات التي تستخدم الطرفية بتجنب التفاعلات المتزامنة وإعادة الدخول معها، بعدم استخدامها في معالجات الإشارات أو حظر الإشارات التي قد تستخدمها، وحمل قفل أثناء استدعاء هذه الدوال والتفاعل مع الطرفية. يجب أيضًا استخدام هذا القفل للاستبعاد المتبادل مع الدوال الموسومة بـ race:tcattr(fd)، حيث fd هو واصف ملف للطرفية المسيطرة. قد يستخدم المستدعي كائن مزامنة واحداً للبساطة، أو استخدام كائن مزامنة واحد لكل طرفية، حتى لو تمت الإشارة إليها بواسطة واصفات ملفات مختلفة.

  ملاحظات أمان أخرى
قد تُرفق كلمات مفتاحية إضافية بالدوال، للإشارة إلى ميزات لا تجعل استدعاء الدالة غير آمن، ولكن قد يلزم أخذها بعين الاعتبار في فئات معينة من البرامج:

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

    مع ذلك، لا نُعلّم هذه الدوال كغير آمنة للخيوط، لأن الدوال التي تُعدّل كائن الإعدادات المحلية مُعلّمة بـ const:locale وتُعتبر غير آمنة. لكونها غير آمنة، لا ينبغي استدعاء الأخيرة عند تشغيل خيوط متعددة أو تمكين الإشارات غير المتزامنة، وبالتالي يمكن اعتبار الإعدادات المحلية ثابتة فعليًا في هذه السياقات، مما يجعل الأولى آمنة.

env الدوال المُعلّمة بـ env كمشكلة أمان خيوط التنفيذ تصل إلى البيئة باستخدام getenv(3) أو ما شابه، دون أي حراس لضمان الأمان في وجود تعديلات متزامنة.

    مع ذلك، لا نُعلّم هذه الدوال كغير آمنة للخيوط، لأن الدوال التي تُعدّل البيئة كلها مُعلّمة بـ const:env وتُعتبر غير آمنة. لكونها غير آمنة، لا ينبغي استدعاء الأخيرة عند تشغيل خيوط متعددة أو تمكين الإشارات غير المتزامنة، وبالتالي يمكن اعتبار البيئة ثابتة فعليًا في هذه السياقات، مما يجعل الأولى آمنة.

hostid
    الدوال المُعلّمة بـ hostid كمشكلة أمان خيوط التنفيذ تقرأ من هياكل البيانات على مستوى النظام التي تحتوي على "معرف المضيف" للجهاز. لا يمكن تعديل هياكل البيانات هذه بشكل ذري عمومًا. نظرًا لأنه من المتوقع ألا يتغير "معرف المضيف" عادةً، تُعتبر الدالة التي تقرأ منه (gethostid(3)) آمنة، بينما الدالة التي تُعدّله (sethostid(3)) مُعلّمة بـ const:hostid، مما يشير إلى أنها قد تتطلب عناية خاصة إذا كان سيتم استدعاؤها. في هذه الحالة المحددة، تعادل العناية الخاصة التنسيق على مستوى النظام (وليس فقط داخل العملية).

sigintr
    الدوال المُعلّمة بـ sigintr كمشكلة أمان خيوط التنفيذ تصل إلى هيكل البيانات الداخلي _sigintr لمكتبة C لجنو دون أي حراس لضمان الأمان في وجود تعديلات متزامنة.

    مع ذلك، لا نُعلّم هذه الدوال كغير آمنة للخيوط، لأن الدوال التي تُعدّل هيكل البيانات هذا كلها مُعلّمة بـ const:sigintr وتُعتبر غير آمنة. لكونها غير آمنة، لا ينبغي استدعاء الأخيرة عند تشغيل خيوط متعددة أو تمكين الإشارات غير المتزامنة، وبالتالي يمكن اعتبار هيكل البيانات ثابتًا فعليًا في هذه السياقات، مما يجعل الأولى آمنة.

cwd الدوال المُعلّمة بـ cwd كمشكلة أمان خيوط التنفيذ قد تُغيّر دليل العمل الحالي مؤقتًا أثناء تنفيذها، مما قد يتسبب في حل أسماء المسارات النسبية بطرق غير متوقعة في خيوط أخرى أو داخل معالجات الإشارات غير المتزامنة أو الإلغاء.

    هذا ليس سببًا كافيًا لتعليم الدوال المُعلّمة بهذا الشكل كغير آمنة للخيوط، ولكن عندما يكون هذا السلوك اختياريًا (مثل nftw(3) مع FTW_CHDIR)، قد يكون تجنب الخيار بديلاً جيدًا لاستخدام أسماء المسارات الكاملة أو استدعاءات النظام المتعلقة بوصف الملف (مثل openat(2)).

:identifier
    قد تُتبع التعليقات أحيانًا بمُعرّفات، تهدف إلى تجميع عدة دوال تصل، على سبيل المثال، إلى هياكل البيانات بطريقة غير آمنة، كما في race و const، أو لتوفير معلومات أكثر تحديدًا، مثل تسمية إشارة في دالة مُعلّمة بـ sig. من المتصور أنه قد يُطبق على lock و corrupt أيضًا في المستقبل.

    في معظم الحالات، سيُسمي المُعرّف مجموعة من الدوال، ولكنه قد يُسمي كائنات عامة أو وسائط دالة، أو خصائص قابلة للتحديد أو مكونات منطقية مرتبطة بها، بتدوين مثل، على سبيل المثال، :buf(arg) للدلالة على مخزن مؤقت مرتبط بالوسيطة arg، أو :tcattr(fd) للدلالة على سمات الطرفية لوصف ملف fd.

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

/condition
    قد تكون بعض تعليقات الأمان شرطية، حيث تنطبق فقط إذا كان تعبير منطقي يتضمن وسائط أو متغيرات عامة أو حتى النواة الأساسية يُقيّم إلى صحيح. على سبيل المثال، يشير /!ps و /one_per_line إلى أن العلامة السابقة تنطبق فقط عندما تكون الوسيطة ps فارغة (NULL)، أو المتغير العام one_per_line غير صفري.

    عندما تكون جميع العلامات التي تجعل الدالة غير آمنة مُزيّنة بمثل هذه الشروط، ولا ينطبق أي من الشروط المُسمّاة، يمكن اعتبار الدالة آمنة.

انظر أيضًا
pthreads(7), signal-safety(7)

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

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

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