SYSCTL - Linux手册页
Linux程序员手册 第2部分
更新日期: 2020-06-09
名称
sysctl-读/写系统参数
语法
#include <unistd.h> #include <linux/sysctl.h> int _sysctl(struct __sysctl_args *args);
说明
当前内核不再存在该系统调用!请参阅注释。
_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下的目录树,并且如果找到了所请求的项目,则调用一些适当的例程以读取或修改值。
返回值
成功完成后,_sysctl()返回0。否则,返回值-1,并设置errno表示错误。
错误说明
- EACCES, EPERM
- 对于遇到的"目录"之一没有搜索权限,在oldval非零的情况下没有读取权限,在newval非零的情况下没有写权限。
- EFAULT
- 调用通过将oldval设置为非NULL来询问先前的值,但是在oldlenp中允许零空间。
- ENOTDIR
- 找不到名称。
版本
该系统调用首次出现在Linux 1.3.57中。在Linux 5.5中已将其删除; glibc支持已在2.32版中删除。
遵循规范
此调用是特定于Linux的,不应在旨在可移植的程序中使用。它起源于4.4BSD。只有Linux具有/ proc / sys镜像,并且Linux和4.4BSD之间的对象命名方案不同,但是sysctl()函数的声明在两者中相同。
备注
长期以来,一直不鼓励使用此系统调用:从Linux 2.6.24开始,使用此系统调用会在内核日志中产生警告,而在Linux 5.5中,该系统调用最终被删除。请改用/ proc / sys接口。
请注意,在仍然存在该系统调用的较旧的内核上,仅当使用CONFIG_SYSCTL_SYSCALL选项配置内核时,该内核才可用。此外,glibc不为该系统调用提供包装器,因此必须使用syscall(2)。
BUGS
对象名称在内核版本之间有所不同,从而使该系统调用对应用程序毫无用处。
并非所有可用的对象都已正确记录。
尚无法通过写入/ 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("This machine is running %*s\n", osnamelth, osname); exit(EXIT_SUCCESS); }
另外参见
proc(5)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。