2011-11-29 49 views
1

我需要爲我的大學類編寫一些內核模塊,現在我正試圖理解我必須使用的各種內核機制。其中之一是等待隊列。我寫了一個簡單的模塊,註冊一個/proc項,也不它read函數裏面的一些簡單的邏輯:需要關於linux內核等待隊列的一些解釋

DECLARE_WAIT_QUEUE_HEAD(event); 

volatile int condvar = 0; 
volatile int should_wait = 1; 

int simple_read_proc(char *page, char **start, off_t offset, int count, int *eof, void *data) { 
    printk(KERN_INFO "simple_read_proc from %i\n", current->pid); 
    if(should_wait == 1) { 
     printk(KERN_INFO "Waiting in %i\n", current->pid); 
     should_wait = 0; 
     wait_event_interruptible(event, condvar == 1); 
     printk(KERN_INFO "Wait finished in %i\n", current->pid); 
     condvar = 0; 
     return sprintf(page, "%s", "The wait has finished!\n"); 
    } else { 
     printk(KERN_INFO "Waking up in %i\n", current->pid); 
     condvar = 1; 
     wake_up_interruptible(&event); 
     return sprintf(page, "%s", "Woke up the other process!\n"); 
    } 
} 

這是當我嘗試在註冊/proc文件運行cat兩次會發生什麼:

首先cat過程等待第二個喚醒他。第二個cat過程確實如此。每個進程打印它應該。迄今爲止,一切都按計劃進行。但後來我考慮dmesg,這是我所看到的:

[11405.484168] Initializing proc_module 
[11413.209535] simple_read_proc from 6497 
[11413.209543] Waiting in 6497 
[11415.498482] simple_read_proc from 6499 
[11415.498489] Waking up in 6499 
[11415.498507] simple_read_proc from 6499 
[11415.498514] Wait finished in 6497 
[11415.498518] Waking up in 6499 
[11415.498546] simple_read_proc from 6497 
[11415.498550] Waking up in 6497 
[11415.498554] simple_read_proc from 6497 
[11415.498557] Waking up in 6497 
[11415.498689] simple_read_proc from 6499 
[11415.498694] Waking up in 6499 
[11415.498753] simple_read_proc from 6497 
[11415.498757] Waking up in 6497 

我的問題是:爲什麼simple_read_proc函數被調用這麼多次?我以爲這可能是因爲cat多次調用read,但我用strace檢查了它,但情況並非如此 - 每個cat只調用read一次。

我將不勝感激這種現象的一些解釋。

回答

2

請參閱fs/proc/generic.c中有關「如何成爲proc讀取功能」的評論。既然你不改變eof,在__proc_file_read循環將調用read_proc函數多次。