sysctl(2)

NUME
sysctl - citește/scrie parametrii de sistem

SINOPSIS
#include <unistd.h>
#include <linux/sysctl.h>

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

DESCRIERE
Acest apel de sistem nu mai există pe nucleele actuale! A se vedea NOTE.

Apelul _sysctl() citește și/sau scrie parametrii nucleului. De exemplu, numele de gazdă sau numărul maxim de fișiere deschise. Argumentul are forma

    struct __sysctl_args {
        int    *name;    /* vector de numere întregi care descrie variabila */
        int     nlen;    /* lungimea acestui vector */
        void   *oldval;  /* 0 sau adresa unde se stochează vechea valoare */
        size_t *oldlenp; /* spațiu disponibil pentru vechea valoare,
                            suprascris de dimensiunea reală a vechii valori */
        void   *newval;  /* 0 sau adresa noii valori */
        size_t  newlen;  /* dimensiunea noii valori */
    };

Acest apel efectuează o căutare într-o structură arborescentă, care poate semăna cu un arbore de directoare sub /proc/sys, iar dacă elementul solicitat este găsit, apelează o rutină adecvată pentru a citi sau modifica valoarea.

VALOAREA RETURNATĂ
La finalizarea cu succes, _sysctl() returnează 0. În caz contrar, se returnează o valoare de -1, iar errno este configurată pentru a indica eroarea.

ERORI-IEȘIRE

EACCES
EPERM
    Nu există permisiune de căutare pentru unul dintre „directoarele” întâlnite, sau nu există permisiune de citire în cazul în care oldval a fost diferită de zero, sau nu există permisiune de scriere în cazul în care newval a fost diferită de zero.

EFAULT
    Invocarea a cerut valoarea anterioară prin stabilirea oldval non-NULL, dar a permis spațiu zero în oldlenp.

ENOTDIR
    name nu a fost găsit.

STANDARDE
Linux.

ISTORIC
Linux 1.3.57. Eliminat în Linux 5.5, glibc 2.32.

Acesta își are originea în 4.4BSD. Numai Linux are oglinda /proc/sys, iar schemele de denumire a obiectelor diferă între Linux și 4.4BSD, dar declarația funcției sysctl() este aceeași în ambele.

NOTE
Utilizarea acestui apel de sistem a fost mult timp descurajată: începând cu Linux 2.6.24, utilizarea acestui apel de sistem a dus la apariția unor avertismente în jurnalul nucleului, iar în Linux 5.5, apelul de sistem a fost în cele din urmă eliminat. Utilizați în schimb interfața /proc/sys.

Rețineți că pe nucleele mai vechi, unde acest apel de sistem încă există, este disponibil numai dacă nucleul a fost configurat cu opțiunea CONFIG_SYSCTL_SYSCALL. În plus, glibc nu oferă o funcție de învăluire pentru acest apel de sistem, fiind necesară utilizarea syscall(2).

ERORI
Numele obiectelor variază de la o versiune de nucleu la alta, ceea ce face ca acest apel de sistem să fie inutil pentru aplicații.

Nu toate obiectele disponibile sunt documentate corespunzător.

Nu este încă posibilă schimbarea sistemului de operare prin scrierea în /proc/sys/kernel/ostype.

EXEMPLE
    #define _GNU_SOURCE
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/syscall.h>
    #include <unistd.h>

    #include <linux/sysctl.h>

    #define ARRAY_SIZE(arr)  (sizeof(arr) / sizeof((arr)[0]))

    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 = ARRAY_SIZE(name);
        args.oldval = osname;
        args.oldlenp = &osnamelth;

        osnamelth = sizeof(osname);

        if (syscall(SYS__sysctl, &args) == -1) {
            perror("_sysctl");
            exit(EXIT_FAILURE);
        }
        printf("Această mașină rulează %*s\n", (int) osnamelth, osname);
        exit(EXIT_SUCCESS);
    }

CONSULTAȚI ȘI
proc(5)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.