sysctl

SYSCTL(2)       Ð ÑководÑÑво пÑогÑаммиÑÑа Linux       SYSCTL(2)



ÐÐЯ
       sysctl - ÑиÑаеÑ/запиÑÑÐ²Ð°ÐµÑ Ð¿Ð°ÑамеÑÑÑ ÑиÑÑемÑ

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

       int _sysctl(struct __sysctl_args *args);

       ÐамеÑание:Ð glibc Ð½ÐµÑ Ð¾Ð±ÑÑÑоÑной ÑÑнкÑии длÑ
       данного ÑиÑÑемного вÑзова; ÑмоÑÑиÑе ÐÐÐÐЧÐÐÐЯ.

ÐÐÐСÐÐÐÐ
       Ðе иÑполÑзÑйÑе ÑÑÐ¾Ñ ÑиÑÑемнÑй вÑзов! СмоÑÑиÑе
       ÐÐÐÐЧÐÐÐЯ.

       СиÑÑемнÑй вÑзов _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 ÐÑл Ñделан запÑÐ¾Ñ Ð¿ÑедÑдÑÑего знаÑениÑ
              пÑÑÑм ÑÑÑановки не-NULL знаÑÐµÐ½Ð¸Ñ oldval, но
              ÑÐ°Ð·Ð¼ÐµÑ Ð¼ÐµÑÑа под него в oldlenp Ñавен нÑлÑ.

       ENOTDIR
              name не найден.

СÐÐТÐÐТСТÐÐРСТÐÐÐÐРТÐÐ
       ÐÑÐ¾Ñ Ð²Ñзов еÑÑÑ ÑолÑко в Linux и не должен
       иÑполÑзоваÑÑÑÑ Ð² пеÑеноÑимÑÑ Ð¿ÑогÑаммаÑ.
       ÐÑзов sysctl() впеÑвÑе поÑвилÑÑ Ð² Linux 1.3.57.
       ÐпеÑвÑе он поÑвилÑÑ Ð² 4.4BSD. ТолÑко в Linux
       ÑÑÑеÑÑвÑÐµÑ Ð·ÐµÑкало /proc/sys, и ÑÑÐµÐ¼Ñ Ð¸Ð¼ÐµÐ½Ð¾Ð²Ð°Ð½Ð¸Ñ
       обÑекÑов в Linux и 4.4BSD ÑазлиÑаÑÑÑÑ, но
       обÑÑвление ÑÑнкÑии sysctl() одинаково в обеиÑ
       ÑиÑÑемаÑ.

ÐÐÐÐЧÐÐÐЯ
       Ð glibc оÑÑÑÑÑÑвÑÐµÑ Ð¾Ð±ÑÑÑоÑÐ½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ ÑÑого
       ÑиÑÑемного вÑзова; вÑзÑвайÑе его ÑеÑез
       syscall(2).  Ðли лÑÑÑе ÑовÑем не иÑполÑзÑйÑе:
       иÑполÑзование данного ÑиÑÑемного вÑзова
       Ñже давно не ÑекомендÑеÑÑÑ Ð¸ он Ñак вÑем не
       нÑавиÑÑÑ, ÑÑо, веÑоÑÑно, иÑÑÐµÐ·Ð½ÐµÑ Ð² новой
       веÑÑии ÑдÑа. ÐаÑÐ¸Ð½Ð°Ñ Ñ Linux 2.6.24, пÑи
       иÑполÑзовании данного ÑиÑÑемного вÑзова
       запиÑÑваеÑÑÑ Ð¿ÑедÑпÑеждение в жÑÑнал ÑдÑа.
       УдалиÑе вÑзов из ÑÐ²Ð¾Ð¸Ñ Ð¿ÑогÑамм пÑÑмо
       ÑейÑаÑ; вмеÑÑо него иÑполÑзÑйÑе инÑеÑÑейÑ
       /proc/sys.

       ÐаннÑй ÑиÑÑемнÑй вÑзов доÑÑÑпен ÑолÑко, еÑли
       ÑдÑо бÑло ÑобÑано Ñ Ð¿Ð°ÑамеÑÑом CONFIG_SYSCTL_SYSCALL.

ÐÐФÐÐТЫ
       ÐÐ°Ð·Ð²Ð°Ð½Ð¸Ñ Ð¾Ð±ÑекÑов ÑазлиÑаÑÑÑÑ Ð² ÑазнÑÑ Ð²ÐµÑÑиÑÑ
       ÑдÑа, ÑÑо Ð´ÐµÐ»Ð°ÐµÑ Ð´Ð°Ð½Ð½Ñй вÑзов в пÑиложениÑÑ
       беÑполезнÑм.

       Ðе вÑе ÑÑÑеÑÑвÑÑÑие обÑекÑÑ Ð¾Ð¿Ð¸ÑанÑ
       ÑооÑвеÑÑÑвÑÑÑим обÑазом.

       РнаÑÑоÑÑее вÑÐµÐ¼Ñ Ð½ÐµÐ²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ измениÑÑ Ñип
       опеÑаÑионной ÑиÑÑÐµÐ¼Ñ Ð¿ÑÑÑм запиÑи в Ñайл
       /proc/sys/kernel/ostype.

ÐÐ ÐÐÐÐ
       #define _GNU_SOURCE
       #include <unistd.h>
       #include <sys/syscall.h>
       #include <string.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <linux/sysctl.h>

       int _sysctl(struct __sysctl_args *args );

       #define OSNAMESZ 100

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

           memset(&args, 0, sizeof(struct __sysctl_args));
           args.name = name;
           args.nlen = sizeof(name)/sizeof(name[0]);
           args.oldval = osname;
           args.oldlenp = &osnamelth;

           osnamelth = sizeof(osname);

           if (syscall(SYS__sysctl, &args) == -1) {
               perror("_sysctl");
               exit(EXIT_FAILURE);
           }
           printf("ÐÑа маÑина ÑабоÑÐ°ÐµÑ Ð² %*s\n", osnamelth, osname);
           exit(EXIT_SUCCESS);
       }

СÐÐТРÐТРТÐÐÐÐ
       proc(5)



Linux                             2012-12-22                         SYSCTL(2)