使用sysctl来实现内核参数修改

本文介绍了如何使用sysctl在内核模块中定义和注册控制条目,包括整型和字符串类型。通过示例展示了如何在用户态应用程序中通过sysctl系统调用来查看和修改这些内核参数。
部署运行你感兴趣的模型镜像

//header: sysctl-exam.h


#ifndef _SYSCTL_EXAM_H


#define _SYSCTL_EXAM_H


#include <linux/sysctl.h>

 

#define MY_ROOT (CTL_CPU + 10)


#define MY_MAX_SIZE 256

 

enum {


        MY_INT_EXAM = 1,


        MY_STRING_EXAM = 2,


}; //sysctl 条目 ID,用户态应用和内核模块需要这些 ID 来操作和注册 sysctl 条目


#endif

 

 

//kernel module: sysctl-exam-kern.c


#include <linux/kernel.h>


#include <linux/module.h>


#include <linux/sysctl.h>


#include "sysctl-exam.h"

 

static char mystring[256];


static int myint;  // 定义模块内部变量

 

static struct ctl_table my_sysctl_exam[] = {   // 在该内核模块中,每一个 sysctl 条目对应一个 struct ctl_table 结构


        {


                .ctl_name       = MY_INT_EXAM,


                .procname       = "myint",


                .data           = &myint,


                .maxlen         = sizeof(int),


                .mode           = 0666,  //条目在proc文件系统下的访问权限


                .proc_handler   = &proc_dointvec, //在通过proc设置时的处理函数(字段proc_handler,对于整型内核变量,应当设置为&proc_dointvec,而对于字符串内核变量,则设置为 &proc_dostring),


        },


        {


                .ctl_name       = MY_STRING_EXAM,


                .procname       = "mystring",


                .data           = mystring,


                .maxlen         = MY_MAX_SIZE,


                .mode           = 0666,


                .proc_handler   = &proc_dostring,


                .strategy       = &sysctl_string, //字符串处理策略(字段strategy,一般这是为&sysctl_string)。


        },


        {


                .ctl_name = 0  //必须把数组的最后一个结构设置为NULL


        }


};

 

static struct ctl_table my_root = {


        .ctl_name       = MY_ROOT,


        .procname       = "mysysctl",


        .mode           = 0555,


        .child          = my_sysctl_exam,


};//Sysctl 条目可以是目录,此时 mode 字段应当设置为 0555,否则通过 sysctl 系统调用将无法访问它下面的 sysctl 条目,

//child 则指向该目录条目下面的所有条目,对于在同一目录下的多个条目,不必一一注册,用户可以把它们组织成一个 struct ctl_table 类型的数组,然后一次注册就可以

 

 

static struct ctl_table_header * my_ctl_header;

 

static int __init sysctl_exam_init(void)


{
        my_ctl_header = register_sysctl_table(&my_root, 0);  //第一个参数为定义的struct ctl_table结构的sysctl条目或条目数组指针

                                                                                             //第二个参数为插入到sysctl条目表中的位置,如果插入到末尾,应当为0,如果插入到开头,则为非0

 

        return 0;


}

 

static void __exit sysctl_exam_exit(void)


{
        unregister_sysctl_table(my_ctl_header);


}

 

module_init(sysctl_exam_init);


module_exit(sysctl_exam_exit);


MODULE_LICENSE("GPL");

 

用户态应用通过sysctl系统调用来查看和设置前面内核模块注册的sysctl条目

用户空间代码如下

int myintctl[] = {MY_ROOT, MY_INT_EXAM};


int mystringctl[] = {MY_ROOT, MY_STRING_EXAM};

 

int sysctl(int *name, int nlen, void *oldval, size_t *oldlenp,void *newval, size_t newlen)


{


        struct __sysctl_args args={name,nlen,oldval,oldlenp,newval,newlen};


        return _sysctl(&args);


}

 

                if (sysctl(myintctl, SIZE(myintctl), &oldmyint, &oldmyintlen, &newmyint, newmyintlen)) {


                        perror("sysctl");


                        exit(-1);


                }


                else {


                        printf("old value: mysysctl.myint = %d\n", oldmyint);


                        printf("new value: mysysctl.myint = %d\n", newmyint);


                }

 


                if (sysctl(mystringctl, SIZE(mystringctl), oldmystring, &oldmystringlen, newmystring, newmystringlen)) {


                        perror("sysctl");


                        exit(-1);


                }
                else {


                        printf("old vale: mysysctl.mystring = \"%s\"\n", oldmystring);


                        printf("new value: mysysctl.mystring = \"%s\"\n", newmystring);


                }

 

 

 

 

 

您可能感兴趣的与本文相关的镜像

GPT-SoVITS

GPT-SoVITS

AI应用

GPT-SoVITS 是一个开源的文本到语音(TTS)和语音转换模型,它结合了 GPT 的生成能力和 SoVITS 的语音转换技术。该项目以其强大的声音克隆能力而闻名,仅需少量语音样本(如5秒)即可实现高质量的即时语音合成,也可通过更长的音频(如1分钟)进行微调以获得更逼真的效果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值