sysctl(2) System Calls Manual sysctl(2)

sysctl - citește/scrie parametrii de sistem

#include <unistd.h>
#include <linux/sysctl.h>
[[depreciat]] int _sysctl(struct __sysctl_args *args);

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.

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

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.
Invocarea a cerut valoarea anterioară prin stabilirea oldval non-NULL, dar a permis spațiu zero în oldlenp.
name nu a fost găsit.

Linux.

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.

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).

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.

#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);
}

proc(5)

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 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.

31 octombrie 2023 Pagini de manual de Linux 6.06