繁体   English   中英

Linux内核:来自“open”系统调用的printk不起作用

[英]Linux-kernel: printk from “open” syscall don't work

我有个疑问。

我打开内核,然后更改了目录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);
}

我编译了这个程序并执行并且运行良好。 但我不明白为什么“测试”没有出现在shell上。 我的意思是,如果我重新启动电脑时会出现很多“测试”这个词,为什么当我执行上面的程序时,这个词不会出现。 只是添加我在上面的代码中包含这些库:

unistd.hfcntl.hstdio.hstdlib.h

感谢大伙们。

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

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

我认为,这是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中添加一个UID检查,并在其他printk-in-open代码中添加。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM