2013-07-28 21 views
3

我試圖在/proc中創建一個條目,以便我可以控制我的內核模塊。我想我得到了write部分,但我無法弄清楚read部分應該如何工作。從LKM創建/ proc中的條目

static char proc_data[1]; 

static ssize_t read_proc(struct file *file, char __user *buf, size_t count, loff_t *pos){ 
    int ret; 
    if(pos > 0){ 
     ret = 0; 
    }else{ 
     memcpy(buf, proc_data, 1); 
     ret = 1; 
    } 
    return ret; 
} 

static ssize_t write_proc(struct file *file, const char __user *buf, size_t count, loff_t *pos){ 

    if(count > 2) 
     return -EINVAL; 

    if(copy_from_user(proc_data, buf, 1)) 
     return -EFAULT; 

    if(strcmp("1", proc_data) == 0){ 
     //Do something 
    }else if(strcmp("0", proc_data) == 0){ 
     //Undo something 
    } 

    return count; 
} 

如果我回到1從read_proc,如果我的貓我的/proc項,它不會停止輸出相同的值。如果我返回0,它不會輸出任何東西。所以我猜我應該第一次返回1,然後返回0,但我不知道如何。

+0

也許你應該打印你從第一次和後續調用中收到的參數...也許具體是偏移參數。他們不是0 /非零,因爲你的代碼似乎已經解決了? – mah

+0

@mah我想到了這一點,但我看不到它們之間的任何關係,因爲count是65535並且是空的。 – alexandernst

+0

我希望在所有情況下(無論調用者要求什麼)在塊效率上都會得到相同的大小計數,並且隨着每次後續調用都會從同一個開放位置增加到該計數大小。請記住,內核調用非常昂貴,因此係統希望將其最小化,並將通過大型緩衝區來實現,從而最大限度地減少要調用的調用數量。 – mah

回答

3

.read.write回調函數中,通常需要在返回前更新loff_t *pos。 如果您的模塊讀取或寫入了count字節,則按該數量增加*pos

此外,請注意,當.read回調返回0時,它表示一個EOF。如果它永遠不會返回0,那麼系統將無限期地循環嘗試「當文件讀取到最後」時,當您的文件爲cat時。這就是爲什麼第一次返回1,然後是0工作。

+0

當我的回調被調用時,'''pos'''應該是0,對吧?我得到一個非常隨機的大負數(大約-131940446716000,給/拿100000)。我在我的'''printk'''中使用''''%lld和(long long int)pos''',這是否正確? – alexandernst

+0

@alexandernst,你打印'pos'或'* pos'?我犯了很多次這樣的錯誤。你所描述的看起來更像是一個指針,如果用有符號整數表示,內核中的結構地址是負數,至少在x86上。我期望在回調的第一次調用時,* pos是0。 – Eugene

+0

糟糕...我正在印刷'''pos'''而不是'''pos'''!多麼愚蠢的錯誤。謝謝 :) – alexandernst