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