我正在尝试动态打印日志。我所做的是我有一个调试变量,我在自己的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
。