本文主要是介绍linux内核网络-sysctl:目录/proc/sys,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
用户在/proc/sys下看到一个文件,实际上是一个内核变量,就没个变量而言,内核可以定义
要将其放在/proc/sys的何处,与相同内核组建或者功能相联系的变量,通常都位于同一个目录中,例如,在/proc/sys/net/ipv4 里可以找到与IPv4相关的文件。
命名,多数时候,文件名只是简单的命名为相关联的内核变量相同的名字,但是,有时候为了更友好一点,其名字也会改变。
访问权限,例如,一个文件可以由任何人读,但只能由超级用户修改。
输出到/proc/sys中的变量内容可借助于相关联的文件进行读写,或者直接用sysctl系统调用。
有些目录和文件在引导期间静态定义,而其他的则是在运动期间添加的,导致运动期间创建目录或文件的事实事例如下:
当一个内核模块实现一项新功能,或者有一个协议被加载或卸载时
当一个新的网络设备被注册或除名时,有些配置参数 如/proc/sys 中的文件 对每个设备而言都有一个实体。例如, /proc/sys/net/ipv4/conf 目录对每个已注册的网络设备而言,其下都有一个子目录。
/proc/sys 中的文件和目录都是以ctl_table 结构定义的。ctl_table 结构的注册和除名是通过在kernel/sysctl.c中定义的register_sysctl_table和unregister_sysctl_table 函数完成。
以下是ctl_table的关键字段。
const char *procname
在/proc/sys中所用的文件名
int maxlen
输出的内核变量的尺寸大小
mode_t mode
分派给/proc/sys中相关联的文件或目录的访问权限
ctl_table *child
用于建立目录与文件之间的父子关系,本节稍后会看到一些相关实例。
proc_handler
当你在/proc/sys中读取或写入一个文件时,完成读取或者写入操作的函数,所有与文件相关联的ctl_instances都必须由proc_handle初始化。内核会给目录分派一个默认值。
stategy
此函数可以选择初始化为--在显示或者存储之前--完成数据的额外格式化工作的函数。当/proc/sys中的文件用sysctl系统调用访问时,此函数就会被调用。
extra1
extra2
两个可选的参数,通常用于定义变量的最小值和最大值。通常把这两个参数成为min/max通常。
根据与文件相关联的变量种类而定,proc_handler和strategy 的初始化也会不同,例如,当内核变量由一个活和多喝整数值组成时,proc_dointvec就是proc_handler所用的函数,表3-1和表3-2列出了可用于处事话proc_handler和strategy的一些函数,所有函数的定义和充分的注释都在kernel/sysctl.c中。
表3-1 初始化proc_handler的函数
proc_dostring 读写一个字符串
proc_dointvec 读写一个包含一个或者多个整数的数组
proc_dointvec_minmax 类似proc_dointvec 但是,要确定输入数据在min.max范围内,不符合该范围的值会被拒绝。
proc_dointvec_jiffies 读写一个整数数组,此内核变量以jiffies位单位表示,但是,返回给用户之前会先转成秒数。
proc_dointvec_ms_jiffies 读写一个整数数组,此内核变量以jiffies位单位表示,但是,返回给用户前会先转成毫秒数。
proc_duolongvec_minmax 蕾丝proc_dointvec_minmax 但是其值为长整数而非整数。
proc_duolongvec_ms_jiffies_minmax 读写一个长整数数组,此内核变量以jiffies为单位表示。
但是,返回给用户前,会先转成毫秒数,此内核变量被指派的值必须在min max范围内。
表3-2 初始化strategy的函数
sysctl_string 读写一个字符串
sysctl_intvec 读写一个整数数组,而且确定其值符合min max范围
sysctl_jiffies 读写一个以jiffies表示的值,然后将其转成秒数
sysctl_ms_jiffies 读写一个以jiffies表示的值,然后将其转成毫秒数
strategy 或者proc_handler函数初始化位包含3-1或者3-2 的函数之一的包裹函数。
这篇关于linux内核网络-sysctl:目录/proc/sys的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!