我有点怀疑。
打开内核,修改目录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 "Testingn");
...
}
我只放了这一行: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);
}
我编译了这个程序并执行并且运行良好。但是我不明白为什么"Testing"没有出现在shell上。我的意思是,如果当我重启电脑时出现了很多"测试"这个词,为什么当我执行上面的程序时这个词没有出现。我在上面的代码中包含了这些库:
unistd.h
, fcntl.h
, stdio.h
, stdlib.h
谢谢大家
printk调用出现在内核消息缓冲区中,而不是在进程' stdout/stderr
但是我不明白为什么"Testing"没有出现在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的特殊用户,并在您的额外的print -in-open代码中在printk
之前添加UID检查。