delete_module(2)

الاسم
delete_module - تفريغ وحدة نواة

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

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

int syscall(SYS_delete_module, const char *name, unsigned int flags);

ملاحظة: لا توفر glibc غلافًا لـ delete_module()، مما يستلزم استخدام syscall(2).

الوصف
تحاول استدعاء النظام delete_module() إزالة إدخال الوحدة القابلة للتحميل غير المستخدمة المحددة بواسطة name. إذا كانت الوحدة تحتوي على دالة exit، فتُنفذ تلك الدالة قبل تفريغ الوحدة. تُستخدم وسيطة flags لتعديل سلوك استدعاء النظام، كما هو موضح أدناه. يتطلب استدعاء النظام هذا صلاحية.

تُحاول إزالة الوحدة وفقًا للقواعد التالية:

(1) إذا كانت هناك وحدات محملة أخرى تعتمد على (أي تشير إلى رموز معرفة في) هذه الوحدة، يفشل الاستدعاء.

(2) خلاف ذلك، إذا كان عدد المراجع للوحدة (أي عدد العمليات التي تستخدم الوحدة حاليًا) صفرًا، تُفرغ الوحدة فورًا.

(3) إذا كانت الوحدة تحتوي على عدد مراجع غير صفري، يعتمد السلوك على البتات المعينة في flags. في الاستخدام العادي (انظر الملاحظات)، يُحدد العلم O_NONBLOCK دائمًا، وقد يُحدد العلم O_TRUNC بالإضافة إلى ذلك.

    للتوليفات المختلفة لـ flags التأثير التالي:

    flags == O_NONBLOCK
        يعود الاستدعاء فورًا مع خطأ.

    flags == (O_NONBLOCK | O_TRUNC)
        تُفرغ الوحدة فورًا، بغض النظر عما إذا كان لها عدد مراجع غير صفري.

    (flags & O_NONBLOCK) == 0
        إذا لم يحدد flags O_NONBLOCK، تحدث الخطوات التالية:

        •   تُوسم الوحدة بحيث لا يُسمح بمراجع جديدة.

        •   إذا كان عدد مراجع الوحدة غير صفري، يُوضع المستدعي في حالة نوم غير قابلة للمقاطعة (TASK_UNINTERRUPTIBLE) حتى يصبح عدد المراجع صفرًا، وعندها يُفك حظر الاستدعاء.

        •   تُفرغ الوحدة بالطريقة المعتادة.

للعلم O_TRUNC تأثير إضافي على القواعد الموصوفة أعلاه. افتراضيًا، إذا كانت الوحدة تحتوي على دالة init ولكن لا تحتوي على دالة exit، تفشل محاولة إزالة الوحدة. ومع ذلك، إذا حُدد O_TRUNC، يُتجاوز هذا المطلب.

استخدام العلم O_TRUNC خطير! إذا لم تُبن النواة مع CONFIG_MODULE_FORCE_UNLOAD، يُتجاهل هذا العلم بصمت. (عادةً، يكون CONFIG_MODULE_FORCE_UNLOAD مفعلًا.) استخدام هذا العلم يلوث النواة (TAINT_FORCED_RMMOD).

قيمة الإرجاع
يُعاد صفر عند النجاح. ويُعاد -1 عند الخطأ وتُضبط errno للإشارة إلى الخطأ.

الأخطاء

EBUSY
    الوحدة ليست "حية" (أي لا تزال قيد التهيئة أو موسومة بالفعل للإزالة)؛ أو، تحتوي الوحدة على دالة init ولكن لا تحتوي على دالة exit، ولم يُحدد O_TRUNC في flags.

EFAULT
    يشير name إلى موقع خارج مساحة العنوان القابلة للوصول للعملية.

ENOENT
    لا توجد وحدة بهذا الاسم.

EPERM
    لم يكن المستدعي متمتعًا بالصلاحية (لم تكن لديه القدرة CAP_SYS_MODULE)، أو تفريغ الوحدة معطل (انظر /proc/sys/kernel/modules_disabled في proc(5)).

EWOULDBLOCK
    وحدات أخرى تعتمد على هذه الوحدة؛ أو، حُدد O_NONBLOCK في flags، ولكن عدد مراجع هذه الوحدة غير صفري ولم يُحدد O_TRUNC في flags.

المعايير
لينكس.

التاريخ
استدعاء النظام delete_module() غير مدعوم من glibc. لا يُقدم إعلان في رؤوس glibc، ولكن، من خلال غرابة تاريخية، أصدرت إصدارات glibc قبل glibc 2.23 واجهة ABI لاستدعاء النظام هذا. لذلك، لاستخدام استدعاء النظام هذا، يكفي (قبل glibc 2.23) الإعلان يدويًا عن الواجهة في الكود الخاص بك؛ بدلاً من ذلك، يمكنك استدعاء النظام باستخدام syscall(2).

  لينكس 2.4 وما قبله
في Linux 2.4 والإصدارات السابقة، أخذ استدعاء النظام وسيطة واحدة فقط:

int delete_module(const char *name);

إذا كان name فارغًا (NULL)، تُزال جميع الوحدات غير المستخدمة والموسومة بالتنظيف الآلي.

بعض التفاصيل الإضافية حول الاختلافات في سلوك delete_module() في لينكس 2.4 والإصدارات الأقدم لا تُشرح حاليًا في صفحة الدليل هذه.

ملاحظات
يُعتبر السكون غير القابل للمقاطعة الذي قد يحدث إذا حُذف O_NONBLOCK من flags غير مرغوب فيه، لأن العملية النائمة تُترك في حالة غير قابلة للقتل. اعتبارًا من لينكس 3.7، تحديد O_NONBLOCK اختياري، لكن في النوى المستقبلية من المرجح أن يصبح إلزاميًا.

انظر أيضًا
create_module(2)، init_module(2)، query_module(2)، lsmod(8)، modprobe(8)، rmmod(8)

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

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

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