使用stat.c更改全局变量

时间:2017-06-09 04:46:30

标签: c debugging linux-kernel global-variables

我正在尝试动态打印日志。我所做的是我有一个调试变量,我在自己的stat_my.c文件中设置。以下是show_stat函数。

extern int local_debug_lk;   

static int show_stat(struct seq_file *p, void *v)
{
        int temp=0;
        if(local_debug_lk == 0)
        {
                seq_printf(p,"local_debug_lk=0, enabling,int_num=%d\n",int_num);
                local_debug_lk=1;
        }
        else
        {
        seq_printf(p,"local_debug_lk=:%d,int_num=%d\n",local_debug_lk,int_num);
                while(temp<int_num){
                seq_printf(p,"%d\n",intr_list_seq[temp]);
                temp++;
                }

                local_debug_lk=0;
                int_num=0;

        }

        return 0;
}

驱动程序文件

int local_debug_lk, int_num;

  isr_root(...){
/*
logic to extract IRQ number, saved in vect variable
*/

                     if(local_debug_lk && (int_num < 50000)){
                        intr_list_seq[int_num]=vect;
                         int_num++;
     }

我期望的是当我执行“cat /proc/show_stat”时,首先它将启用local_debug_lk标志,并且每当驱动程序文件中发生中断时,它将存储在intr_list_seq[]数组中。当我第二次执行“cat /proc/stat_my”时,它应该打印IRQ序列并通过设置local_debug_lk=0禁用IRQ记录。

但......发生的事情是,我总是得到 “local_debug_lk=0, enabling,int_num=0”登录cat;即local_debug_lk总是为零;它永远不会启用。

另外,当我的驱动程序没有运行时,它运行正常! 连续两次“cat /proc/stat_my”时,第一个值设置为1,然后再设置为0。

我的驱动程序是否可能没有选择local_debug_lk变量的最新更新值?

你能告诉我这里我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

.show函数的更多调用可能比文件中的读数(使用cat /proc/show_stat)。此外,基础系统需要来自.show稳定结果:如果使用相同参数调用,该函数应将相同信息打印到seq_file

正因为如此,切换 .show函数中的一个标志 little sence ,并使函数的输出依赖在这个标志上只是错误

通常,在文件 read 时更改任何内核状态不是用户期望的。最好使用 write 功能。

函数.show实际上将信息打印到临时内核缓冲区中。如果一切正常,缓冲区中的信息将传输到用户缓冲区,最终由cat打印。但是如果内核缓冲区太小,打印到其中的信息被丢弃。在这种情况下,底层系统会分配更大的缓冲区,并再次调用.show

此外,如果用户缓冲区太小而无法容纳所有打印的信息,则会重新运行.show