register_sysctl_table实现内核数据交互

Sysctl是一种用户应用来设置和获得运行时内核的配置参数的一种有效方式,通过这种方式,用户应用可以在内核运行的任何时刻来改变内核的配置参数,也可以在任何时候获得内核的配置参数。
通常,内核的这些配置参数也出现在proc文件系统的/proc/sys
目录下,用户应用可以直接通过这个目录下的文件来实现内核配置的读写操作。
使用register_sysctl_table方式实现内核数据交互,就不得不用提到struct ctl_table
。下面来介绍一下这个结构体。
1 结构体ctl_table
每一个sysctl条目对应一个 struct ctl_table 结构,在该结构体定义在文件./include/
linux/sysctl.h中,定义及解释如下:
/* A sysctl table is an array of struct ctl_table: */
[cpp] view plaincopyprint?
  1. struct ctl_table  
  2. {  
  3.     const char *procname; /* Text ID for /proc/sys, or zero */  
  4.     void *data;  
  5.     int maxlen;  
  6.     mode_t mode;  
  7.     struct ctl_table *child;  
  8.     struct ctl_table *parent; /* Automatically set */  
  9.     proc_handler *proc_handler; /* Callback for text         formatting */  
  10.     void *extra1;  
  11.     void *extra2;  
  12. };  
struct ctl_table
{const char *procname; /* Text ID for /proc/sys, or zero */void *data;int maxlen;mode_t mode;struct ctl_table *child;struct ctl_table *parent; /* Automatically set */proc_handler *proc_handler; /* Callback for text         formatting */void *extra1;void *extra2;
};
成员变量解释:
const char *procname; /* 表示在proc/sys/下显示的文件名称 */
void *data;           /* 表示对应于内核中的变量名称    */
int maxlen;           /* 表示条目允许的最大长度         */
mode_t mode;             /* 条目在proc文件系统下的访问权限 */
struct ctl_table *child;
struct ctl_table *parent; /* Automatically set */
proc_handler *proc_handler; /*回调函数&proc_dointvec/&proc_dostring */
void *extra1;
void *extra2;

字段maxlen,它主要用于字符串内核变量,以便在对该条目设置时,对超过该最大长度的字符串截掉后面超长的部分.

字段proc_handler,表示回调函数,对于整型内核变量,应当设置为&proc_dointvec,而对于字符串内核变量,则设置为 &proc_dostring。

 

Sysctl 条目也可以是目录,此时 mode 字段应当设置为 0555,否则通过 sysctl 系统调用将无法访问它下面的 sysctl 条目,child 则指向该目录条目下面的所有条目,对于在同一目录下的多个条目,不必一一注册,用户可以把它们组织成一个 struct ctl_table 类型的数组,然后一次注册就可以。

2 注册register_sysctl_table
注册sysctl条目使用函数register_sysctl_table,函数原型如下:
struct ctl_table_header *register_sysctl_table(struct ctl_table *table)
第一个参数为定义的struct ctl_table结构的sysctl条目或条目数组指针;
3 卸载unregister_sysctl_table
当模块卸载时,需要使用函数unregister_sysctl_table,其原型:
void unregister_sysctl_table(struct ctl_table_header * header)
其中struct ctl_table_header是通过函数register_sysctl_table
注册时返回的结构体指针。
4 实例
[cpp] view plaincopyprint?
  1. /********************************************** 
  2.   * Author: lewiyon@hotmail.com 
  3.   * File name: sysctl_example.c 
  4.   * Description: sysctl example 
  5.   * Date: 2013-04-24 
  6.   *********************************************/  
  7.   
  8. #include <linux/module.h>  
  9. #include <linux/init.h>  
  10. #include <linux/kernel.h>  
  11. #include <linux/sysctl.h>  
  12.   
  13. static int sysctl_kernusr_data = 1024;  
  14.   
  15. static int kernusr_callback(ctl_table *table, int write,  
  16.         void __user *buffer, size_t *lenp, loff_t *ppos)  
  17. {  
  18.     int rc;  
  19.     int *data = table->data;  
  20.   
  21.     printk(KERN_INFO "original value = %d\n", *data);  
  22.   
  23.     rc = proc_dointvec(table, write, buffer, lenp, ppos);  
  24.     if (write)  
  25.         printk(KERN_INFO "this is write operation, current value = %d\n", *  
  26. data);  
  27.   
  28.     return rc;  
  29. }  
  30.   
  31. static struct ctl_table kernusr_ctl_table[] = {  
  32.     {  
  33.         .procname       = "kernusr",  
  34.         .data           = &sysctl_kernusr_data,  
  35.         .maxlen         = sizeof(int),  
  36.         .mode           = 0644,  
  37.         .proc_handler   = kernusr_callback,  
  38.     },  
  39.     {  
  40.         /* sentinel */  
  41.     },  
  42. };  
  43.   
  44. static struct ctl_table_header *sysctl_header;  
  45.   
  46. static int __init sysctl_example_init(void)  
  47. {  
  48.     sysctl_header = register_sysctl_table(kernusr_ctl_table);  
  49.     if (sysctl_header == NULL) {  
  50.         printk(KERN_INFO "ERR: register_sysctl_table!");  
  51.         return -1;  
  52.     }  
  53.   
  54.     printk(KERN_INFO "sysctl register success.\n");  
  55.     return 0;  
  56.   
  57. }  
  58.   
  59. static void __exit sysctl_example_exit(void)  
  60. {  
  61.     unregister_sysctl_table(sysctl_header);  
  62.     printk(KERN_INFO "sysctl unregister success.\n");  
  63. }  
  64.   
  65. module_init(sysctl_example_init);  
  66. module_exit(sysctl_example_exit);  
  67. MODULE_LICENSE("GPL");  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403952.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware10中安装Mac10.9.3

教程网上确实有&#xff0c;我主要参考这个&#xff1a;http://bbs.pcbeta.com/viewthread-1418055-1-1.html 但是我按它的步骤&#xff0c;用我自己下载的mac os x 10.9.3原版.dmg在启动系统时就是会失败&#xff0c;我试过提取里面的InstallESD.dmg(取了2次&#xff0c;第一…

cisco 交换机通过console 导入 IOS

准备说明&#xff1a; 电脑上安装有 SecureCRT 软件 导入 IOS&#xff1a; 第一步&#xff1a;使用 SecureCRT 连接上交换机。进入rommon 模式&#xff08;CtrlBreak组合键&#xff09; 第二部&#xff1a;设置波特率为115200.调整波特率&#xff0c;可以大大减少灌IOS的时间&a…

localStorage.getItem 往浏览器里面储存数据到本地localStorage

借鉴https://blog.csdn.net/aaa333qwe/article/details/79025336 往浏览器里面储存数据 localStorage.setItem(‘todos’, JSON.stringify(value)) 读取 const list JSON.parse(localStorage.getItem(‘todos’)) || []

SchemaSpy:数据库构架文档生产器,以及该软件的部分缺陷修改。提供工具包下载...

&#xff08;一&#xff09;SchemaSpy 官方网站&#xff1a;http://schemaspy.sourceforge.net/ 该软件名称的官方解释为&#xff1a;Graphical Database Schema Metadata Browser 我的压缩包&#xff08;SchemaSpy_5.0.0_工具包&#xff09;&#xff1a; SchemaSpy_5.0.0.jar&…

container_of分析

1.container_of宏 1> Container_of在Linux内核中是一个常用的宏&#xff0c;用于从包含在某个结构中的指针获得结构本身的指针&#xff0c;通俗地讲就是通过结构体变量中某个成员的首地址进而获得整个结构体变量的首地址。2>接口&#xff1a;container_of(ptr, type, mem…

ZOJ 1450 Minimal Circle 点集的最小圆覆盖

From: http://blog.csdn.net/zmx354/article/details/17076267 给定一个点集&#xff0c;求出能覆盖点集内所有点的半径最小的圆。包含点在圆上的情况。个人感觉算是比较麻烦的计算几何模板了。 在网上看了很多解题&#xff0c;大多数都摘抄自《求一个包含点集所有点的最小圆…

poj1050最大子矩阵和

这篇是看了别人的报告写的&#xff0c;就当是屡屡思路好了. 题目大意。给定一个n阶矩阵&#xff08;方阵&#xff09;,每一个元素中存在一个数字.任务就是求出一个最大的子矩阵使得矩阵元素之间的和是最大的. n100; 1.矩阵A[m][n]的和能够直接 sumA[i][j] ( i 0 to n-1 j0 to …

vue里写三元判断绑定class和style

<a-select:disabled"(dataBaseId ? false : true)"style"width: 100%"showSearchplaceholder"请输入选择表名"v-decorator"[tableId,{rules: [{ required: false, message: 请输入选择表名}]}]":defaultActiveFirstOption"fa…

命令行选项解析函数(C语言):getopt()和getopt_long()

上午在看源码项目 webbench 时&#xff0c;刚开始就被一个似乎挺陌生函数 getopt_long() 给卡住了&#xff0c;说实话这函数没怎么见过&#xff0c;自然不知道这哥们是干什么的。于是乎百度了一番&#xff0c;原来是处理命令行选项参数的&#xff0c;的确&#xff0c;正规点的大…

centos5.3搭建安全高效的LNMP服务器

操作系统基于centos 5.3 #!/bin/bash # BY kerryhu # QQ:263205768 # MAIL:king_819163.com # BLOG:http://kerry.blog.51cto.com # Please manual operation yum of before Operation..... # yum install ntp vim-enhanced gcc gcc-c flex bison autoconf \ # automake …

夺命雷公狗ThinkPHP项目之----企业网站2之数据库的快速设计

我们在一个项目的时候&#xff0c;花费最多事件的估计还是数据库的时间了&#xff0c;我们的数据库暂时就这样设计好了&#xff1a; 暂时我们的数据库就这样设计好了用下先,建好后如下所示&#xff1a; 转载于:https://www.cnblogs.com/leigood/p/5411017.html

vue监听对象某一个属性

watch: {uploadObj: {//监听对象deep: true,handler: function(value) {if (!value.receiver && !value.receiveBastionIds) {this.userArrShow true;this.machineSelectShow true;this.$message.warning("接收人及接收堡垒机至少选择一项&#xff0c;请重新填写…

find 命令搜索符号链接文件夹的方法

From: http://blog.csdn.net/caspiansea/article/details/7456048 find 命令默认情况下&#xff0c;不会到符号链接指向的文件夹下面搜索匹配的文件。 要想达到此目的&#xff0c;可以使用如下的方法&#xff1a; [plain] view plaincopyprint?find -L dirname -name "…

typedef和define具体的详细区别

1) #define是预处理指令&#xff0c;在编译预处理时进行简单的替换&#xff0c;不作正确性检查&#xff0c;不关含义是否正确照样带入&#xff0c;只有在编译已被展开的源程序时才会发现可能的错误并报错。例如&#xff1a; #define PI 3.1415926 程序中的&#xff1a;areaPI*r…

字符串替换方法的优劣

需求&#xff1a;String str "中aacabbbaac中sabbcccdddddeee"; String[] findStr {"aa","b","c","d","e","f","g"} ; String[] repStr {"A","B","C",…

Fedora 19 Mate环境安装Gnome3

From: http://blog.csdn.net/skykingf/article/details/9230297 等了N久的Fedora19终于出来了&#xff0c;安装时选了Mate桌面&#xff0c;装完后发现真是回到了Gnome2的年代&#xff0c;同样是Mate&#xff0c;Fedora就不能向Mint15里的Mate学学&#xff1f;起码也让用户感觉…

6月份美国域名总量新增近5.4万个 环比减少51%

中国IDC评述网07月03日报道&#xff1a;据域名统计机构WebHosting.info公布的数据显示&#xff0c;截至2012年6月25日&#xff0c;美国域名总量达到了79,632,920个&#xff0c;域名增幅较小。下面&#xff0c;IDC评述网与大家一起关注6月份美国域名注册量最新情况。 &#xff0…

vue+element-ui大文件的分片上传和断点续传js-spark-md5和browser-md5-file

注意&#xff1a;以下共两份代码片段&#xff0c;第一份为原博主链接代码&#xff0c;第二份自己写的整体代码&#xff08;比较乱&#xff09; 1.参考 https://www.cnblogs.com/kelelipeng/p/10158599.html &#xff08;js-spark-md5和browser-md5-file&#xff09; 和 https:…

Fedora 20 安装试用体验全程讲解

From: http://www.jb51.net/os/Fedora/177583.html Fedora 20在两次跳票后正式发布&#xff0c;主要特性包括&#xff1a;远程桌面方案X2Go&#xff1b;网络管理器支持扩大绑定和桥接功能&#xff1b;改进3D打印机支持等&#xff0c;本文中&#xff0c;作者对Fedora 20 进行安装…