Linux-ядро: printk из "открытого" системного вызова не работает - PullRequest
6 голосов
/ 19 ноября 2011

У меня есть сомнения.

Я открыл ядро ​​и изменил каталог 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 ]

6 голосов
/ 19 ноября 2011

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

4 голосов
/ 19 ноября 2011

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

Думаю, это эффект подавления сообщений в 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.

...