6

我有个疑问。

我打开内核并更改目录 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

感谢你们。

4

2 回答 2

6

printk调用出现在内核消息缓冲区中,而不是在您的进程的 stdout/stderr 中

于 2011-11-19T00:18:02.003 回答
4

但我不明白为什么“测试”没有出现在外壳上。

我认为,这是 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 的特殊用户,并printk在您的附加 printk-in-open 代码之前添加一个 UID 检查。

于 2011-11-18T23:59:45.743 回答