SYSCTL - Linux手册页

Linux程序员手册 第2部分
更新日期: 2020-06-09

名称

sysctl-读/写系统参数

版本

该系统调用首次出现在Linux 1.3.57中。在Linux 5.5中已将其删除; glibc支持已在2.32版中删除。

BUGS

对象名称在内核版本之间有所不同,从而使该系统调用对应用程序毫无用处。

并非所有可用的对象都已正确记录。

尚无法通过写入/ proc / sys / kernel / ostype来更改操作系统。

备注

长期以来,一直不鼓励使用此系统调用:从Linux 2.6.24开始,使用此系统调用会在内核日志中产生警告,而在Linux 5.5中,该系统调用最终被删除。请改用/ proc / sys接口。

请注意,在仍然存在该系统调用的较旧的内核上,仅当使用CONFIG_SYSCTL_SYSCALL选项配置内核时,该内核才可用。此外,glibc不为该系统调用提供包装器,因此必须使用syscall(2)。

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/

错误说明

EACCES, EPERM
对于遇到的"目录"之一没有搜索权限,在oldval非零的情况下没有读取权限,在newval非零的情况下没有写权限。
EFAULT
调用通过将oldval设置为非NULL来询问先前的值,但是在oldlenp中允许零空间。
ENOTDIR
找不到名称。

说明

当前内核不再存在该系统调用!请参阅注释。

_sysctl()调用读取和/或写入内核参数。例如,主机名或打开文件的最大数量。参数具有以下形式

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 */
};

该调用在树结构中进行搜索,该树结构可能类似于/ proc / sys下的目录树,并且如果找到了所请求的项目,则调用一些适当的例程以读取或修改值。

另外参见

proc(5)

遵循规范

此调用是特定于Linux的,不应在旨在可移植的程序中使用。它起源于4.4BSD。只有Linux具有/ proc / sys镜像,并且Linux和4.4BSD之间的对象命名方案不同,但是sysctl()函数的声明在两者中相同。

返回值

成功完成后,_sysctl()返回0。否则,返回值-1,并设置errno表示错误。

语法

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

int _sysctl(struct __sysctl_args *args);

示例

#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("This machine is running %*s\n", osnamelth, osname);
    exit(EXIT_SUCCESS);
}
日期:2019-08-20 17:58:34 来源:oir作者:oir