Linux-ядро: printk из "открытого" системного вызова не работает

Я сомневаюсь.

Я открыл ядро ​​и изменил каталог linux-3.1.1/fs/open.c

Я изменил следующий код в open.c.

SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, int, mode)
{
    long ret;
    printk(KERN_EMERG "Testing\n");
    ... 
}

Я поставил только эту строку:printk(KERN_EMERG "Testing");

И я включаю библиотеки:<linux/kernel.h> а также <linux/printk.h>

Поэтому я скомпилировал и перезагрузил свой Linux(Ubuntu). Во время перезагрузки на экране появилось много "Тестирований". Так что до сих пор все в порядке.


Но сейчас у меня проблема. Я создал эту программу в c.

int main()
{
    size_t filedesc = open("testefile2.txt",O_CREAT | O_WRONLY,0640);
    printf("%d",filedesc);
}

Я скомпилировал эту программу, выполнил и работает хорошо. Но я не понимаю, почему "Тестирование" не появилось на оболочке. Я имею в виду, что, когда я перезагружаю компьютер, появляется много слова "Тестирование", почему это слово не появляется, когда я запускаю программу выше. Просто чтобы добавить, я включаю эти библиотеки в этот код выше:

unistd.h, fcntl.h, stdio.h, stdlib.h

Спасибо вам, ребята.

2 ответа

Решение

Но я не понимаю, почему "Тестирование" не появилось на оболочке.

Я думаю, это эффект подавления сообщений в printk. (точнее:ограничение скорости)

Проверьте журнал сообщений или консоль на наличие

printk: ### messages suppressed.

строка.

Эта функция прекратит печать сообщения, если в последнее время было много сообщений.

Фактический код - ядро ​​3.1: http://lxr.linux.no/#linux+v3.1.1/kernel/printk.c#L1621.

1621 * printk rate limiting, lifted from the networking subsystem.
1622 *
1623 * This enforces a rate limit: not more than 10 kernel messages
1624 * every 5s to make a denial-of-service attack impossible.
1625 */
1626 DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);
1627
1628 int __printk_ratelimit(const char *func)

Итак, как open системный вызов очень-очень популярен (просто strace -e open /bin/ls - Я получу 15 open системные вызовы для начала простейшего ls), ограничение скорости будет в силе. Это ограничит ваше сообщение для печати только один раз в 5 секунд; не более 10 сообщений в одном "взрыве".

Я могу только предложить создать специального пользователя с известным UID и добавить проверку UID перед printk в вашем дополнительном коде printk-in-open.

Вызовыprintk появляются в буфере сообщений ядра, а не в вашем процессе ' stdout/stderr

Другие вопросы по тегам