1.2.2 sysctl(/proc/sys目录)
sysctl接口允许用户读取或者修改内核参数。在用户空间可以通过两种方法访问sysctl导出的变量。一种方法是通过sysctl系统调用,另一种是通过procfs。如果内核支持procfs,它会在/proc目录下增加一个特殊的目录(/proc/sys),这个目录里包含了sysctl导出变量的列表。
procps包里的sysctl命令可以用于配置sysctl接口导出的内核参数,实际上这个命令是通过/prco/sys目录下的文件与内核通信的。大多数Linux发行版的内核都默认包含了sysctl的支持。
通过sysctl系统调用和命令来设置和获得运行时内核的配置参数是一种有效的方式,通过这种方式,用户可以在内核运行的任何时刻修改和获取内核的配置参数。例如,通过cat /proc/sys/net/ipv4/ip_forward来获取内核网络层是否允许转发IP数据报。通过echo 1 > /proc/sys/net/ipv4/ip_forward将内核网络层设置为允许转发IP数据报。通过cat /proc/sys/kernel/ostype可以获取操作系统的类型,其实也可以通过sysctl系统调用达到同样的效果。#include
#include
#include
#include
#include
#include
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);
}
图1-1显示了以root_table为顶点形成的树状结构。
(点击查看大图)图1-1 sysctl的组织
点赞 0