由于自己水平和精力有限,本篇博文只涉及如何使用的问题,不涉及讲解原理,如果有朋友对如何创建命令的原理感兴趣,可以自己进行探讨。
sysctl概述在FreeBSD系统上,设备通信和控制主要通过sysctl和ioctl接口,也就是在用户层(shell)配置的方式,进行对底层驱动参数的一个设置。
具体使用方式例如:
sysctl -A : 通过此命令查看系统当中都有那些可以配置的参数。
比如输入sysctl -A命令后有以下输出,
a.b.c : 1
a.b.c是一种二进制的表示方式,1代表某个参数的值,当然也可以是字符类型或者结构体等。具体的后面遇到代码再讲解。
随后,如果我们输入sysctl a.b.c命令是查看该参数的值,
而sysctl a.b.c=2是将此参数的值进行修改,如果你看到有
0 -> 2的输出就代表值从0修改为了2,已经成功修改了。
我们通过一个例程对怎么创建sysctl配置命令的有一个感官上的认识。如下
#include#include #include #include #include static struct sysctl_ctx_list clist; static struct sysctl_oid *poid; static int i = 10; static long j = 20; static const char *c = "hello init"; static int sysctl_procedure(SYSCTL_HANDLER_ARGS) { const char *buf = "sysctl_procedure call"; return sysctl_handle_string(oidp, buf, strlen(buf), req); } static int sysctl_modevent(module_t mod_unused, int event, void *arg __unused) { int error = 0; switch (event) { case MOD_LOAD: sysctl_ctx_init(&clist); poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(), OID_AUTO, "top", CTLFLAG_RW, 0, "tree top"); if (poid == NULL) { printf("SYSCTL_ADD_NODE failedn"); return EINVAL; } SYSCTL_ADD_LONG(&clist, SYSCTL_CHILDREN(poid), OID_AUTO, "long", CTLFLAG_RW, &j, 0, "creat long leaf"); SYSCTL_ADD_INT(&clist, SYSCTL_CHILDREN(poid), OID_AUTO, "int", CTLFLAG_RW, &i, 0, "creat int leaf"); poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(poid), OID_AUTO, "node", CTLFLAG_RW, 0, "tree node"); if (poid == NULL) { printf("SYSCTL_ADD_NODE failedn"); return EINVAL; } SYSCTL_ADD_PROC(&clist, SYSCTL_CHILDREN(poid), OID_AUTO, "proc", CTLFLAG_RD, 0, 0, sysctl_procedure, "A", "creat proc leaf"); poid = SYSCTL_ADD_NODE(&clist, SYSCTL_STATIC_CHILDREN(_debug), OID_AUTO, "top", CTLFLAG_RW, 0, "tree node"); if(poid == NULL) { printf("SYSCTL_ADD_NODE failedn"); return EINVAL; } SYSCTL_ADD_STRING(&clist, SYSCTL_CHILDREN(poid), OID_AUTO, "string", CTLFLAG_RD, c, 0, "new string leaf"); printf("module loadedn"); break; case MOD_UNLOAD: if (sysctl_ctx_free(&clist)) { printf("sysctl_ctx_free failed.n"); return -1; } printf("module unloadedn"); break; default: error = -1; break; } return error; } static moduledata_t sysctl_mod = { "sysctl_modevent", sysctl_modevent, NULL }; DECLARE_MODULE(sysctl_modevent, sysctl_mod, SI_SUB_EXEC, SI_ORDER_ANY);
makefile:
动态创建sysctl宏总结 SYSCTL_STATIC_CHILDREN 宏 SYSCTL_CHILDREN宏 sysctl接口的简单使用
devlink概述
后面在补齐。



