get_robust_list(2)

الاسم
get_robust_list, set_robust_list - الحصول/تعيين قائمة futexes القوية

المكتبة
مكتبة سي المعيارية (libc، -lc)

موجز
#include <linux/futex.h>   /* تعريف struct robust_list_head */
#include <sys/syscall.h>   /* تعريف ثوابت SYS_* */
#include <unistd.h>

long syscall(SYS_get_robust_list, int pid,
             struct robust_list_head **head_ptr, size_t *sizep);
long syscall(SYS_set_robust_list,
             struct robust_list_head *head, size_t size);

ملاحظة: لا توفر glibc أغلفة لنداءات النظام هذه، مما يستلزم استخدام syscall(2).

الوصف
تتعامل استدعاءات النظام هذه مع قوائم futex القوية لكل خيط. تُدار هذه القوائم في مساحة المستخدم: لا يعرف النواة سوى موقع رأس القائمة. يمكن للخيط إعلام النواة بموقع قائمة futex القوية الخاصة به باستخدام set_robust_list(). يمكن الحصول على عنوان قائمة futex القوية للخيط باستخدام get_robust_list().

الغرض من قائمة futex القوية هو ضمان أنه إذا فشل خيط عن طريق الخطأ في إلغاء قفل futex قبل إنهائه أو استدعاء execve(2)، يتم إعلام خيط آخر ينتظر على ذلك futex بأن المالك السابق للـ futex قد مات. يتكون هذا الإعلام من جزأين: يتم تعيين بت FUTEX_OWNER_DIED في كلمة futex، وتقوم النواة بتنفيذ عملية futex(2) FUTEX_WAKE على أحد الخيوط المنتظرة على الـ futex.

يقوم استدعاء النظام get_robust_list() بإرجاع رأس قائمة futex القوية للخيط الذي تم تحديد معرف الخيط الخاص به في pid. إذا كان pid يساوي 0، يتم إرجاع رأس القائمة للخيط المستدعي. يتم تخزين رأس القائمة في الموقع المشار إليه بواسطة head_ptr. يتم تخزين حجم الكائن المشار إليه بواسطة **head_ptr في sizep.

يخضع الإذن لاستخدام get_robust_list() لفحص وضع الوصول ptrace PTRACE_MODE_READ_REALCREDS؛ انظر ptrace(2).

يطلب استدعاء النظام set_robust_list() من النواة تسجيل رأس قائمة futexes القوية المملوكة للخيط المستدعي. الوسيطة head هي رأس القائمة المراد تسجيلها. يجب أن تكون الوسيطة size مساوية لـ sizeof(*head).

قيمة الإرجاع
يقوم استدعاءا النظام set_robust_list() و get_robust_list() بإرجاع صفر عند نجاح العملية، أو رمز خطأ بخلاف ذلك.

الأخطاء
يمكن أن يفشل استدعاء النظام set_robust_list() مع الخطأ التالي:

EINVAL
    لا يساوي size sizeof(struct robust_list_head).

يمكن أن يفشل استدعاء النظام get_robust_list() مع الأخطاء التالية:

EFAULT
    لا يمكن تخزين رأس قائمة futex القوية في الموقع head.

EPERM
    لا يمتلك الاستدعاء الحالي الإذن لرؤية قائمة futex القوية للخيط ذي معرف الخيط pid، ولا يمتلك القدرة CAP_SYS_PTRACE.

ESRCH
    لم يتم العثور على خيط بمعرف الخيط pid.

الإصدارات
أُضيفت استدعاءات النظام هذه في Linux 2.6.17.

ملاحظات
لا تحتاج التطبيقات العادية إلى استدعاءات النظام هذه.

يمكن أن يمتلك الخيط قائمة futex قوية واحدة فقط؛ لذلك يجب على التطبيقات التي ترغب في استخدام هذه الوظيفة استخدام كائنات المزامنة القوية المقدمة من glibc.

في التنفيذ الأولي، كان يتم إعلام الخيط المنتظر على futex بأن المالك قد مات فقط إذا أنهى المالك. بدءًا من Linux 2.6.28، تم توسيع الإعلام ليشمل الحالة التي يقوم فيها المالك بتنفيذ execve(2).

معرفات الخيوط المذكورة في النص الرئيسي هي معرفات خيوط kernel من النوع الذي يتم إرجاعه بواسطة clone(2) و gettid(2).

انظر أيضًا
futex(2), pthread_mutexattr_setrobust(3)

Documentation/robust-futexes.rst و Documentation/robust-futex-ABI.rst في شجرة مصدر نواة Linux

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

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

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