sysctl(2)

الاسم
sysctl - قراءة/كتابة معلمات النظام

موجز
#include <unistd.h>
#include <linux/sysctl.h>

[[deprecated]] int _sysctl(struct __sysctl_args *args);

الوصف
استدعاء النظام هذا لم يعد موجودًا على النوى الحالية! انظر الملاحظات.

استدعاء _sysctl() يقرأ و/أو يكتب معلمات النواة. على سبيل المثال، اسم المضيف، أو الحد الأقصى لعدد الملفات المفتوحة. الوسيط له الشكل

    struct __sysctl_args {
        int    *name;    /* متجه عدد صحيح يصف المتغير */
        int     nlen;    /* عدد عناصر هذا المتجه */
        void   *oldval;  /* 0 أو عنوان تخزين القيمة القديمة */
        size_t *oldlenp; /* المساحة المتاحة للقيمة القديمة,
                            يحل محلها الحجم الفعلي للقيمة القديمة */
        void   *newval;  /* 0 أو عنوان القيمة الجديدة */
        size_t  newlen;  /* حجم القيمة الجديدة */
    };

يقوم هذا الاستدعاء ببحث في بنية شجرية، تشبه على الأرجح شجرة دليل تحت /proc/sys، وإذا تم العثور على العنصر المطلوب، يستدعي روتينًا مناسبًا لقراءة القيمة أو تعديلها.

قيمة الإرجاع
عند الإكمال بنجاح، يُرجع _sysctl() 0. وإلا، تُرجع قيمة -1 ويُضبط errno للإشارة إلى الخطأ.

الأخطاء

EACCES
EPERM
    لا يوجد إذن بحث لأحد "الأدلة" التي تمت مواجهتها، أو لا يوجد إذن قراءة حيث كان oldval غير صفري، أو لا يوجد إذن كتابة حيث كان newval غير صفري.

EFAULT
    طلب الاستدعاء القيمة السابقة بتعيين oldval غير NULL، لكنه سمح بمساحة صفرية في oldlenp.

ENOTDIR
    لم يتم العثور على name.

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

التاريخ
4.4BSD، لينكس 1.3.57. أُزيل في لينكس 5.5، glibc 2.32.

فقط لينكس لديه المرآة /proc/sys، وتختلف مخططات تسمية الكائنات بين لينكس و4.4BSD، لكن تعريف دالة sysctl() هو نفسه في كليهما.

ملاحظات
كان استخدام استدعاء النظام هذا مثبطًا لفترة طويلة: منذ لينكس 2.6.24، تؤدي استخدامات استدعاء النظام هذا إلى تحذيرات في سجل النواة، وفي لينكس 5.5، أُزيل استدعاء النظام نهائيًا. استخدم واجهة /proc/sys بدلاً من ذلك.

لاحظ أنه على النوى الأقدم حيث لا يزال استدعاء النظام هذا موجودًا، فهو متاح فقط إذا تم تكوين النواة مع خيار CONFIG_SYSCTL_SYSCALL. علاوة على ذلك، لا يوفر glibc غلافًا لاستدعاء النظام هذا، مما يستلزم استخدام syscall(2).

العلل
تختلف أسماء الكائنات بين إصدارات النواة، مما يجعل استدعاء النظام هذا عديم القيمة للتطبيقات.

ليست كل الكائنات المتاحة موثقة بشكل صحيح.

ليس من الممكن بعد تغيير نظام التشغيل بالكتابة إلى /proc/sys/kernel/ostype.

أمثلة
    #define _GNU_SOURCE
    #include <stdcountof.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/syscall.h>
    #include <unistd.h>

    #include <linux/sysctl.h>

    int _sysctl(struct __sysctl_args *args);

    #define OSNAMESZ 100

    int
    main(void)
    {
        int                   name[] = { CTL_KERN, KERN_OSTYPE };
        char                  osname[OSNAMESZ];
        size_t                osnamelth;
        struct __sysctl_args  args;

        memset(&args, 0, sizeof(args));
        args.name = name;
        args.nlen = countof(name);
        args.oldval = osname;
        args.oldlenp = &osnamelth;

        osnamelth = sizeof(osname);

        if (syscall(SYS__sysctl, &args) == -1) {
            perror("_sysctl");
            exit(EXIT_FAILURE);
        }
        printf("This machine is running %*s\n", (int) osnamelth, osname);
        exit(EXIT_SUCCESS);
    }

انظر أيضًا
proc(5)

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

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

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