2:sysctl

From Linux Man Pages

Jump to: navigation, search
      sysctl - read/write system parameters
      

Contents

SYNOPSIS

      #include <unistd.h>
      #include <linux/unistd.h>
      #include <linux/sysctl.h>
      #include <errno.h>
 
      _syscall1(int, _sysctl, struct __sysctl_args *, args)
                /* Using syscall(2) may be preferable; see intro(2) */
 
      int _sysctl(struct __sysctl_args *args);

DESCRIPTION

      The  _sysctl()  call  reads  and/or writes kernel parameters. For example, the hostname, or the maximum number of
      open files. The argument has the form
 
      struct __sysctl_args {
              int *name;        /* integer vector describing variable */
              int nlen;         /* length of this vector */
              void *oldval;     /* 0 or address where to store old value */
              size_t *oldlenp;  /* available room for old value,
                                   overwritten by actual size of old value */
              void *newval;     /* 0 or address of new value */
              size_t newlen;    /* size of new value */
      };
 
      This call does a search in a tree structure, possibly resembling a directory tree under  /proc/sys,  and  if  the
      requested item is found calls some appropriate routine to read or modify the value.

EXAMPLE

      #include <linux/unistd.h>
      #include <linux/types.h>
      #include <linux/sysctl.h>
 
      _syscall1(int, _sysctl, struct __sysctl_args *, args);
      int sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,
                 void *newval, size_t newlen)
      {
              struct __sysctl_args args={name,nlen,oldval,oldlenp,newval,newlen};
              return _sysctl(&args);
      }
 
      #define SIZE(x) sizeof(x)/sizeof(x[0])
      #define OSNAMESZ 100
 
      char osname[OSNAMESZ];
      int osnamelth;
      int name[] = { CTL_KERN, KERN_OSTYPE };
 
      main(){
              osnamelth = sizeof(osname);
              if (sysctl(name, SIZE(name), osname, &osnamelth, 0, 0))
                      perror("sysctl");
              else
                      printf("This machine is running %*s\n", osnamelth, osname);
              return 0;
      }

RETURN VALUE

      Upon  successful  completion, _sysctl() returns 0. Otherwise, a value of -1 is returned and errno is set to indi-
      cate the error.

ERRORS

      EFAULT The invocation asked for the previous value by setting oldval non-NULL, but allowed zero room in  oldlenp.
 
      ENOTDIR
             name was not found.
 
      EPERM  No search permission for one of the encountered `directories', or no read permission where oldval was non-
             zero, or no write permission where newval was non-zero.

CONFORMING TO

      This call is Linux-specific, and should not be used in programs intended to be portable.   A  sysctl()  call  has
      been present in Linux since version 1.3.57. It originated in 4.4BSD. Only Linux has the /proc/sys mirror, and the
      object naming schemes differ between Linux and 4.4BSD, but the declaration of the sysctl(2) function is the  same
      in both.

BUGS

      The  object names vary between kernel versions.  THIS MAKES THIS SYSTEM CALL WORTHLESS FOR APPLICATIONS.  Use the
      /proc/sys interface instead.
      Not all available objects are properly documented.
      It is not yet possible to change operating system by writing to /proc/sys/kernel/ostype.

RELATED

      proc(5)

CATEGORY

Personal tools