[英]Changing global variable using 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=%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記錄。
但是……發生的是,我總是在cat
上收到“ local_debug_lk=0, enabling,int_num=0
”的登錄信息; 即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
重新運行.show
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.