使用 stat.c 更改全局变量



我正在尝试动态打印日志。我所做的是我有一个调试变量,我在自己的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=%dn",int_num);
local_debug_lk=1;
}
else
{
seq_printf(p,"local_debug_lk=:%d,int_num=%dn",local_debug_lk,int_num);
while(temp<int_num){
seq_printf(p,"%dn",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变量的最新更新值?

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

对函数的调用可能比从文件中读取(使用cat /proc/show_stat)更多.show函数的调用更多。此外,底层系统期望从.show获得稳定的结果:如果使用相同的参数调用,该函数应将相同的信息打印到seq_file

正因为如此,.show函数中切换一个标志有一点意义,让函数的输出依赖于这个标志是完全错误的

通常,在读取文件时更改任何内核状态不是用户期望的。为此最好使用写入功能。


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

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

相关内容

  • 没有找到相关文章

最新更新