免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1153 | 回复: 0
打印 上一主题 下一主题

读写内核参数:sysctl VS /proc文件系统(不完全攻略) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-11-20 18:07 |只看该作者 |倒序浏览
工作一个多月了,一直很忙,而且接触的知识点也很零碎,没时间也没什么知识点需要整理,很长时间没更新blog了,前几天工作接触了一下/proc文件系统,长了点小经验,记录在此吧。
想要读写内核参数,可以有以下两种方法(不知道还有没有别的方法,暂时我知道的只有这两种):通过/proc文件系统或者利用sysctl系统调用。
一般情况下,利用读写/proc文件系统的方法更简单和方便一些,每种可调内核参数在/proc/sys下都表现为一个子目录,而这个目录下面的每个文件都相应的代表着内核单独的一个可调系统参数。我们想要修改可调内核参数,直接对这些文件进行读写就行了。
如果不使用上面的方法,我们还可以通过sysctl系统调用来实现相同的功能。
看过源代码,我们知道,struct ctl_table是相关的主要的数据结构。定义如下:
struct ctl_table
{
    int ctl_name;            /* Binary ID */
    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 */
    ctl_handler *strategy;        /* Callback function for all r/w */
    void *extra1;
    void *extra2;
};
每个这样的数据结构,都对应了/proc/sys目录下的一项内核参数。
其中各字段的意义如下:
ctl_name: 唯一标识此表项的一个整数。
proc_name: 相对于/proc/sys目录下对应的参数名称。
data: 一个void *指针,指向与这个表项相关联的数据的指针。
maxlen: 可以读取或者写入data的最大字节数。eg:data指向的是一个int型参数,则maxlen一般为sizeof(int)。
mode: 文件的权限。
child: 如果此数据结构对应的表项为一目录,则chind是指向其子表项的指针。
parent: 同child,指向其所在目录对应的ctl_table。
proc_handler: 如果是通过/proc/sys文件读写内核运行时的参数,则执行此操作。
strategy: 如果是通过系统调用sysctl对内核参数进行读写,则调用此函数。
extra1和extra2可以指向处理这个表项时的任何补充数据。
-------
个人觉得,上面标红的地方还是很有用的。
下面分别简单说下这两个函数大概的执行流程:
proc_handler:
一般情况下,proc_handler指向proc_dostring(操作数为string)或者proc_dointvec(操作数为int)。
strategy:
sysctl ==> sys_sysctl ==> do_sysctl ==> parse_table ==> do_sysctl_strategy ==> ctl_table中strategy对应的操作。
有关这块的知识点还很多,这里只是记录了一下我工作时用到的内容,对没提到的知识点感兴趣的朋友再去google吧。
ps:刚参加工作,有点累,但是很充实,很庆幸找到了一个自己喜欢的工作,能接触到Linux内核和Tcp/Ip较多的问题。努力吧,前方的路还很远阿。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u2/83905/showart_2099601.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP