Reference

sysctl(3)

get or set system information

NAME

sysctl, sysctlbyname, sysctlnametomib – get or set system information

LIBRARY

Standard C Library (libc, -lc)

SYNOPSIS

#include <sys/types.h>

#include <sys/sysctl.h>

int

sysctl(int *name, u_int namelen, void *oldp, size_t *oldlenp, void *newp, size_t newlen);

int

sysctlbyname(const char *name, void *oldp, size_t *oldlenp, void *newp, size_t newlen);

int

sysctlnametomib(const char *name, int *mibp, size_t *sizep);

DESCRIPTION

The sysctl() function retrieves system information and allows processes with appropriate privileges to set system information. The information available from sysctl() consists of integers, strings, and tables. Information may be retrieved and set from the command interface using the sysctl(8) utility.

Unless explicitly noted below, sysctl() returns a consistent snapshot of the data requested. Consistency is obtained by locking the destination buffer into memory so that the data may be copied out without blocking. Calls to sysctl() are serialized to avoid deadlock.

The state is described using a ``Management Information Base'' (MIB) style name, listed in name, which is a namelen length array of integers.

The sysctlbyname() function accepts an ASCII representation of the name and internally looks up the integer name vector. Apart from that, it behaves the same as the standard sysctl() function.

The information is copied into the buffer specified by oldp. The size of the buffer is given by the location specified by oldlenp before the call, and that location gives the amount of data copied after a successful call and after a call that returns with the error code ENOMEM. If the amount of data available is greater than the size of the buffer supplied, the call supplies as much data as fits in the buffer provided and returns with the error code ENOMEM. If the old value is not desired, oldp and oldlenp should be set to NULL.

The size of the available data can be determined by calling sysctl() with the NULL argument for oldp. The size of the available data will be returned in the location pointed to by oldlenp. For some operations, the amount of space may change often. For these operations, the system attempts to round up so that the returned size is large enough for a call to return the data shortly thereafter.

To set a new value, newp is set to point to a buffer of length newlen from which the requested value is to be taken. If a new value is not to be set, newp should be set to NULL and newlen set to 0.

The sysctlnametomib() function accepts an ASCII representation of the name, looks up the integer name vector, and returns the numeric representation in the mib array pointed to by mibp. The number of elements in the mib array is given by the location specified by sizep before the call, and that location gives the number of entries copied after a successful call. The resulting mib and size may be used in subsequent sysctl() calls to get the data associated with the requested ASCII name. This interface is intended for use by applications that want to repeatedly request the same variable (the sysctl() function runs in about a third the time as the same request made via the sysctlbyname() function).

The top level names are defined with a CTL_ prefix in ⟨sys/sysctl.h⟩, and are as follows. The next and subsequent levels down are found in the include files listed here, and described in separate sections below.

NameNext level namesDescription
CTL_DEBUGsys/sysctl.hDebugging
CTL_VFSsys/mount.hFile system
CTL_HWsys/sysctl.hGeneric CPU, I/O
CTL_KERNsys/sysctl.hHigh kernel limits
CTL_MACHDEPsys/sysctl.hMachine dependent
CTL_NETsys/socket.hNetworking
CTL_USERsys/sysctl.hUser-level
CTL_VMsys/resources.hVirtual memory (struct loadavg)

For example, the following retrieves the maximum number of processes allowed in the system:

int maxproc;
size_t len = sizeof(maxproc);
sysctlbyname("kern.maxproc", &maxproc, &len, NULL, 0);

To retrieve the standard search path for the system utilities:

char *p;
size_t len;
sysctlbyname("user.cs_path", NULL, &len, NULL, 0);
p = malloc(len);
sysctlbyname("user.cs_path", p, &len, NULL, 0);

CTL_VFS

A distinguished second level name, VFS_GENERIC, is used to get general information about all file systems. One of its third level identifiers is VFS_MAXTYPENUM that gives the highest valid file system type number. Its other third level identifier is VFS_CONF that returns configuration information about the file system type given as a fourth level identifier (see getvfsbyname(3) as an example of its use). The remaining second level identifiers are the file system type number returned by a statfs(2) call or from VFS_CONF. The third level identifiers available for each file system are given in the header file that defines the mount argument structure for that file system.

CTL_HW

The string and integer information available for the CTL_HW level is detailed below. The changeable column shows whether a process with appropriate privilege may change the value.

NameTypeChangeable
hw.activecpuint32_tno
hw.byteorderint32_tno
hw.cacheconfiguint64_t[] no
hw.cachelinesizeint64_tno
hw.cachesizeuint64_t[] no
hw.cpu64bit_capableint32_tno
hw.cpufamilyuint32_tno
hw.cpufrequencyint64_tno
hw.cpufrequency_maxint64_tno
hw.cpufrequency_minint64_tno
hw.cpusubtypeint32_tno
hw.cputhreadtypeint32_tno
hw.cputypeint32_tno
hw.l1dcachesizeint64_tno
hw.l1icachesizeint64_tno
hw.l2cachesizeint64_tno
hw.l3cachesizeint64_tno
hw.logicalcpuint32_tno
hw.logicalcpu_maxint32_tno
hw.machinechar[]no
hw.memsizeint64_tno
hw.modelchar[]no
hw.ncpuint32_tno
hw.packagesint32_tno
hw.pagesizeint64_tno
hw.physicalcpuint32_tno
hw.physicalcpu_maxint32_tno
hw.tbfrequencyint64_tno
hw.byteorder

The byte order (4321 or 1234).

hw.model

The machine model.

hw.ncpu

The number of cpus. This attribute is deprecated and it is recommended that hw.logicalcpu, hw.logicalcpu_max, hw.physicalcpu, or hw.physicalcpu_max be used instead.

hw.logicalcpu

The number of logical processors available in the current power management mode.

hw.logicalcpu_max

The maximum number of logical processors that could be available this boot.

hw.physicalcpu

The number of physical processors available in the current power management mode.

hw.physicalcpu_max

The maximum number of physical processors that could be available this boot.

hw.pagesize

The software page size in bytes.

CTL_KERN

The string and integer information available for the CTL_KERN level is detailed below. The changeable column shows whether a process with appropriate privilege may change the value. The types of data currently available are process information, system vnodes, the open file entries, routing table entries, virtual memory statistics, load average history, and clock rate information.

NameTypeChangeable
kern.argmaxint32_tno
kern.bootargschar[]no
kern.boottimestruct timevalno
kern.check_openevtint32_tyes
kern.clockratestruct clockinfono
kern.coredumpint32_tyes
kern.corefilechar[]yes
kern.flush_cache_on_writeint32_tyes
kern.hostidint32_tyes
kern.hostnamechar[]yes
kern.job_controlint32_tno
kern.maxfilesint32_tyes
kern.maxfilesperprocint32_tyes
kern.maxnbufint32_tyes
kern.maxprocint32_tyes
kern.maxprocperuidint32_tyes
kern.maxvnodesint32_tyes
kern.msgbufint32_tyes
kern.nbufint32_tno
kern.netbootint32_tno
kern.ngroupsint32_tno
kern.nisdomainnamechar[]yes
kern.num_filesint32_tno
kern.num_tasksint32_tno
kern.num_taskthreadsint32_tno
kern.num_threadsint32_tno
kern.num_vnodesint32_tno
kern.nxint32_tyes
kern.osreleasechar[]no
kern.osrevisionint32_tno
kern.ostypechar[]no
kern.osversionchar[]yes
kern.posix1versionint32_tno
kern.procnamechar[]yes
kern.safebootint32_tno
kern.saved_idsint32_tno
kern.secure_kernelint32_tno
kern.securelevelint32_tyes
kern.singleuserint32_tno
kern.sleeptimestruct timevalno
kern.slideint32_tno
kern.stack_depth_maxint32_tno
kern.stack_sizeint32_tno
kern.sugid_coredumpint32_tyes
kern.sugid_scriptsint32_tyes
kern.symfilechar[]no
kern.usrstackint32_tno
kern.usrstack64int64_tno
kern.uuidchar[]no
kern.versionchar[]no
kern.waketimestruct timevalno
kern.argmax

The maximum bytes of argument to execve(2).

kern.boottime

A struct timeval structure is returned. This structure contains the time that the system was booted.

kern.clockrate

A struct clockinfo structure is returned. This structure contains the clock, statistics clock and profiling clock frequencies, the number of micro-seconds per hz tick and the skew rate.

kern.hostid

Get or set the host id.

kern.hostname

Get or set the hostname.

kern.job_control

Return 1 if job control is available on this system, otherwise 0.

kern.maxfiles

The maximum number of files that may be open in the system.

kern.maxfilesperproc

The maximum number of files that may be open for a single process. This limit only applies to processes with an effective uid of nonzero at the time of the open request. Files that have already been opened are not affected if the limit or the effective uid is changed.

kern.maxproc

The maximum number of concurrent processes the system will allow.

kern.maxprocperuid

The maximum number of concurrent processes the system will allow for a single effective uid. This limit only applies to processes with an effective uid of nonzero at the time of a fork request. Processes that have already been started are not affected if the limit is changed.

kern.maxvnodes

The maximum number of vnodes available on the system.

kern.ngroups

The maximum number of supplemental groups.

kern.nisdomainname

The name of the current YP/NIS domain.

kern.osrelease

The system release string.

kern.osrevision

The system revision number.

kern.ostype

The system type string.

kern.posix1version

The version of IEEE Std 1003.1 (“POSIX.1”) with which the system attempts to comply.

kern.saved_ids

Returns 1 if saved set-group and saved set-user ID is available.

kern.securelevel

The system security level. This level may be raised by processes with appropriate privilege. It may not be lowered.

kern.version

The system version string.

CTL_MACHDEP

The set of variables defined is architecture dependent. The following variables are defined for the i386 architecture.

NameTypeChangeable
machdep.cpu.address_bits.physicalint32_tno
machdep.cpu.address_bits.virtualint32_tno
machdep.cpu.brandint32_tno
machdep.cpu.brand_stringchar[]no
machdep.cpu.cache.L2_associativityint32_tno
machdep.cpu.cache.linesizeint32_tno
machdep.cpu.cache.sizeint32_tno
machdep.cpu.core_countint32_tno
machdep.cpu.cores_per_packageint32_tno
machdep.cpu.extfamilyint32_tno
machdep.cpu.extfeature_bitsint64_tno
machdep.cpu.extfeatureschar[]no
machdep.cpu.extmodelint32_tno
machdep.cpu.familyint32_tno
machdep.cpu.feature_bitsint64_tno
machdep.cpu.featureschar[]no
machdep.cpu.leaf7_feature_bitsuint32_tno
machdep.cpu.leaf7_featureschar[]no
machdep.cpu.logical_per_packageint32_tno
machdep.cpu.max_basicuint32_tno
machdep.cpu.max_extuint32_tno
machdep.cpu.microcode_versionint32_tno
machdep.cpu.modelint32_tno
machdep.cpu.processor_flagint32_tno
machdep.cpu.signatureint32_tno
machdep.cpu.steppingint32_tno
machdep.cpu.thread_countint32_tno
machdep.cpu.tlb.data.largeint32_tno
machdep.cpu.tlb.data.large_level1int32_tno
machdep.cpu.tlb.data.smallint32_tno
machdep.cpu.tlb.data.small_level1int32_tno
machdep.cpu.tlb.inst.largeint32_tno
machdep.cpu.tlb.inst.smallint32_tno
machdep.cpu.tlb.sharedint32_tno
machdep.cpu.ucupdateint32_tyes
machdep.cpu.vendorchar[]no
machdep.cpu.xsave.extended_stateuint32_tno
machdep.tsc.deep_idle_rebaseuint32_tyes
machdep.tsc.frequencyint64_tno
machdep.tsc.nanotime.generationuint32_tno
machdep.tsc.nanotime.shiftuint32_tno

CTL_NET

The string and integer information available for the CTL_NET level is detailed below. The changeable column shows whether a process with appropriate privilege may change the value.

Second level nameTypeChangeable
PF_ROUTErouting messagesno
PF_INETIPv4 valuesyes
PF_INET6IPv6 valuesyes
PF_ROUTE

Return the entire routing table or a subset of it. The data is returned as a sequence of routing messages (see route(4) for the header file, format and meaning). The length of each message is contained in the message header.

The third level name is a protocol number, which is currently always 0. The fourth level name is an address family, which may be set to 0 to select all address families. The fifth, sixth, and seventh level names are as follows:

Fifth level Sixth levelSeventh level
NET_RT_FLAGS rtflagsNone
NET_RT_DUMP NoneNone or fib number
NET_RT_IFLIST 0 or if_indexNone
NET_RT_IFMALIST 0 or if_indexNone
NET_RT_IFLISTL 0 or if_indexNone
PF_INET

Get or set various global information about the IPv4 (Internet Protocol version 4). The third level name is the protocol. The fourth level name is the variable name. The currently defined protocols and names are:

ProtocolVariableTypeChangeable
icmpbmcastechointegeryes
icmpmaskreplintegeryes
ipforwardingintegeryes
ipredirectintegeryes
ipttlintegeryes
udpchecksumintegeryes
PF_INET6

Get or set various global information about the IPv6 (Internet Protocol version 6). The third level name is the protocol. The fourth level name is the variable name.

For variables net.inet6.* please refer to inet6(4). For variables net.inet6.*.ipsec6, please refer to ipsec(4).

CTL_USER

The string and integer information available for the CTL_USER level is detailed below. The changeable column shows whether a process with appropriate privilege may change the value.

NameTypeChangeable
user.bc_base_maxint32_tno
user.bc_dim_maxint32_tno
user.bc_scale_maxint32_tno
user.bc_string_maxint32_tno
user.coll_weights_maxint32_tno
user.cs_pathchar[]no
user.expr_nest_maxint32_tno
user.line_maxint32_tno
user.posix2_c_bindint32_tno
user.posix2_c_devint32_tno
user.posix2_char_termint32_tno
user.posix2_fort_devint32_tno
user.posix2_fort_runint32_tno
user.posix2_localedefint32_tno
user.posix2_sw_devint32_tno
user.posix2_upeint32_tno
user.posix2_versionint32_tno
user.re_dup_maxint32_tno
user.stream_maxint32_tno
user.tzname_maxint32_tno
user.bc_base_max

The maximum ibase/obase values in the bc(1) utility.

user.bc_dim_max

The maximum array size in the bc(1) utility.

user.bc_scale_max

The maximum scale value in the bc(1) utility.

user.bc_string_max

The maximum string length in the bc(1) utility.

user.coll_weights_max

The maximum number of weights that can be assigned to any entry of the LC_COLLATE order keyword in the locale definition file.

user.cs_path

Return a value for the PATH environment variable that finds all the standard utilities.

user.expr_nest_max

The maximum number of expressions that can be nested within parenthesis by the expr(1) utility.

user.line_max

The maximum length in bytes of a text-processing utility's input line.

user.posix2_c_bind

Return 1 if the system's C-language development facilities support the C-Language Bindings Option, otherwise 0.

user.posix2_c_dev

Return 1 if the system supports the C-Language Development Utilities Option, otherwise 0.

user.posix2_char_term

Return 1 if the system supports at least one terminal type capable of all operations described in IEEE Std 1003.2 (“POSIX.2”), otherwise 0.

user.posix2_fort_dev

Return 1 if the system supports the FORTRAN Development Utilities Option, otherwise 0.

user.posix2_fort_run

Return 1 if the system supports the FORTRAN Runtime Utilities Option, otherwise 0.

user.posix2_localedef

Return 1 if the system supports the creation of locales, otherwise 0.

user.posix2_sw_dev

Return 1 if the system supports the Software Development Utilities Option, otherwise 0.

user.posix2_upe

Return 1 if the system supports the User Portability Utilities Option, otherwise 0.

user.posix2_version

The version of IEEE Std 1003.2 (“POSIX.2”) with which the system attempts to comply.

user.re_dup_max

The maximum number of repeated occurrences of a regular expression permitted when using interval notation.

user.stream_max

The minimum maximum number of streams that a process may have open at any one time.

user.tzname_max

The minimum maximum number of types supported for the name of a timezone.

CTL_VM

The string and integer information available for the CTL_VM level is detailed below. The changeable column shows whether a process with appropriate privilege may change the value.

NameTypeChangeable
vm.loadavgstruct loadavgno
vm.swapusagestruct xsw_usageno
vm.loadavg

Return the load average history. The returned data consists of a struct loadavg.

RETURN VALUES

The sysctl() function returns the value 0 if successful; otherwise the value -1 is returned and the global variable errno is set to indicate the error.

FILES

In sys/sysctl.h

definitions for top level identifiers, second level kernel and hardware identifiers, and user level identifiers

In sys/socket.h

definitions for second level network identifiers

In netinet/in.h

definitions for third level IPv4/IPv6 identifiers and fourth level IPv4/v6 identifiers

In netinet/icmp_var.h

definitions for fourth level ICMP identifiers

In netinet/icmp6.h

definitions for fourth level ICMPv6 identifiers

In netinet/udp_var.h

definitions for fourth level UDP identifiers

ERRORS

The following errors may be reported:

[EFAULT]

The buffer name, oldp, newp, or length pointer oldlenp contains an invalid address.

[EINVAL]

The name array is less than two or greater than CTL_MAXNAME.

[EINVAL]

A non-null newp is given and its specified length in newlen is too large or too small.

[ENOMEM]

The length pointed to by oldlenp is too short to hold the requested value.

[ENOMEM]

The smaller of either the length pointed to by oldlenp or the estimated size of the returned data exceeds the system limit on locked memory.

[ENOMEM]

Locking the buffer oldp, or a portion of the buffer if the estimated size of the data to be returned is smaller, would cause the process to exceed its per-process locked memory limit.

[ENOTDIR]

The name array specifies an intermediate rather than terminal name.

[EISDIR]

The name array specifies a terminal name, but the actual name is not terminal.

[ENOENT]

The name array specifies a value that is unknown.

[EPERM]

An attempt is made to set a read-only value.

[EPERM]

A process without appropriate privilege attempts to set a value.

SEE ALSO

confstr(3), sysconf(3), sysctl(8)

HISTORY

The sysctl() function first appeared in 4.4BSD.

History