Мне нужно написать какой-нибудь модуль ядра для моих университетских классов, и теперь я пытаюсь понять различные механизмы ядра, которые я должен использовать.Одним из них являются очереди ожидания .Я написал простой модуль, который регистрирует запись /proc
и выполняет некоторую простую логику внутри его функции read
:
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");
}
}
Вот что происходит, когда я пытаюсь дважды запустить cat
на зарегистрированном /proc
file:
Первый 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
только один раз.
Iбыл бы признателен за объяснение этого явления.