gpt4 book ai didi

使用 stat.c 更改全局变量

转载 作者:行者123 更新时间:2023-11-30 14:56:45 26 4
gpt4 key购买 nike

我正在尝试动态打印日志。我所做的是在我自己的 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,启用,int_num=0"登录cat;即 local_debug_lk 始终为零;它永远不会被启用。

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

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

你能让我知道我在这里做错了什么吗?

最佳答案

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

因此,切换 .show 函数中的标志意义不大,并且使函数的输出依赖 这个标志完全是错误

通常,在读取文件时更改任何内核状态并不是用户所期望的。最好使用写入功能来实现这一点。

<小时/>

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

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

关于使用 stat.c 更改全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44449485/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com