原本是使用linux kernel 2.6.28
改成 linux kernel 3.0.4后
却发现cat /proc/sys/dev/file
读到的资料变成乱码 且是持续产生
Linux 2.6.28 :(如预期)
sysctl /proc/sys/dev/file
.proc.sys.dev.file = 0 0 0 0 0 0 0 0
cat /proc/sys/dev/file
0 0 0 0 0 0 0 0
Linux 3.0.4 : (不如预期的结果)
sysctl /proc/sys/dev/file
kernel.sched_child_runs_first = 0
kernel.sched_rt_period_us = 1000000
kernel.sched_rt_runtime_us = 950000
.....一大堆资讯 但就是没有需要的 还出现别的file的值
cat /proc/sys/dev/file
一堆不断出现的乱码
(但贴到PTT上却变成
rnel.sched_child_runs_first = 0
kernel.sched_rt_period_us = 10
....
等 跟sysctl指令结果一样的资讯)
不知道有没有人有类似的经验 或是知道3.0.4的用法??
code 如下 :
ctl_table dev_table[] =
{
{
//.ctl_name = DEV_FILE, Linux 3.0.4 此变量被移除了
.procname = "file",
.maxlen = 8*sizeof(int),
.mode = 0644,
.data = file_table,
.proc_handler = &file_proc_handler,
//如果改成proc_dointvec_minmax 就正常....但想要接别的功能
//.strategy = &sysctl_intvec, Linux 3.0.4 此变量被移除了
.extra1 = &file_min,
.extra2 = &file_max,
},
{0}
};
static int file_proc_handler(ctl_table *ctl, int write, struct file *filp,
void *buffer, size_t *lenp, loff_t *offp)
{
int ret;
ret = proc_dointvec_minmax(ctl, write, buffer, lenp, offp);
if(write && !strcmp(ctl->procname,"file")){
file_handler(); //show on the led
}
return ret;
}
自己找到正确方法了
自己试出答案 复制 fs/drop_caches.c drop_caches_sysctl_handler()的作法
{
int ret;
/*add min and max value check*/
ret = proc_dointvec_minmax(ctl, write, buffer, lenp, offp);
if(ret)
return ret;
if (write){
led_handler(); //show on the led
}
return 0;
}
ctl_table root_table[] =
{
{"dev", NULL, 0, 0555, dev_table},
}
最后在driver_init() 注册
register_sysctl_table(root_table);