【问题标题】:Call from c code a kernel variable in freebsd从c代码调用freebsd中的内核变量
【发布时间】:2013-02-28 05:32:19
【问题描述】:

我找到了一些关于这个主题的在线资源,但仍然无法理解它是如何工作的。

假设我有一个具有以下规范的全局变量 在文件中:/sys/sys/sysctl.h

#define USER_TZNAME_MAX     20   /*test var*/

在文件 /usr/src/sys/kern/kern_mib.c 中

SYSCTL_INT(_user, USER_TZNAME_MAX, tzname_max, CTLFLAG_RW, 0, 0, "something");

任何人都可以实际演示如何更改变量值并在 c 源文件中设置另一个值吗?

谢谢

【问题讨论】:

    标签: c global-variables variable-assignment freebsd


    【解决方案1】:

    #define USER_TZNAME_MAX不是定义全局变量,它是一个预处理器宏。

    在编译器编译代码之前,预处理器会运行以扩展宏并包含/排除定义所定义的代码。

    在这样的示例中,预处理器会将源中字符串“USER_TZNAME_MAX”的所有实例替换为字符串“20”:

    // this
    int i = USER_TZNAME_MAX;
    
    // will be expanded to this:
    int i = 20;
    

    因此,您不能在运行时更改此变量,因为 a) 它不是变量,b) 它是常量。

    如果您要更改您自己代码中使用的值,您可以这样做:

    #ifdef USER_TZNAME_MAX
    #undef USER_TZNAME_MAX
    #endif
    
    #define USER_TZNAME_MAX (32)
    

    【讨论】:

    • 我选择这个变量只是作为一个例子。命令呢:sysctl -w variablenewvalue。这就是我试图从我的代码中做的事情。我想在代码中获取并访问 user.tzname_max 的实际值,从命令行 sysctl user.tzname_max 运行后打印的结果
    【解决方案2】:

    在程序中,您应该使用sysctl(3) 来获取或设置系统信息。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-04
      • 1970-01-01
      • 1970-01-01
      • 2014-10-19
      • 1970-01-01
      • 2015-08-29
      相关资源
      最近更新 更多