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
一次。
我將不勝感激這種現象的一些解釋。