簡體   English   中英

使用stat.c更改全局變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM