Use*_*erJ 6 c linux system-calls linux-kernel 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");
...
}
Run Code Online (Sandbox Code Playgroud)
我只把这一行: 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);
}
Run Code Online (Sandbox Code Playgroud)
我编译了这个程序并执行并且运行良好.但我不明白为什么"测试"没有出现在shell上.我的意思是,如果我重新启动电脑时会出现很多"测试"这个词,为什么当我执行上面的程序时,这个词并没有出现.只是添加我在上面的代码中包含这些库:
unistd.h,fcntl.h,stdio.h,stdlib.h
感谢你们.
\n\n\n但我不明白为什么“测试”没有出现在外壳上。
\n
我认为,这是 printk 消息抑制的效果。(更准确地说:速率限制)
\n\n检查消息日志或控制台
\n\nprintk: ### messages suppressed.\nRun Code Online (Sandbox Code Playgroud)\n\n细绳。
\n\n如果最近有大量消息,此功能将停止打印消息。
\n\n实际代码为3.1内核:http://lxr.linux.no/#linux+v3.1.1/kernel/printk.c#L1621
\n\n1621 * printk rate limiting, lifted from the networking subsystem.\n1622 *\n1623 * This enforces a rate limit: not more than 10 kernel messages\n1624 * every 5s to make a denial-of-service attack impossible.\n1625 */\n1626 DEFINE_RATELIMIT_STATE(printk_ratelimit_state, 5 * HZ, 10);\n1627\n1628 int __printk_ratelimit(const char *func)\nRun Code Online (Sandbox Code Playgroud)\n\n因此,由于open系统调用非常非常流行(只需执行strace -e open /bin/ls- I'll get 15 opensyscalls for just start a simple ls),速率限制将生效。它将限制您的消息在 5 秒内仅打印一次;单次“突发”消息不超过 10 条。
我只能建议创建一个具有已知 UID 的特殊用户,并printk在附加 printk-in-open 代码之前添加 UID 检查。
| 归档时间: |
|
| 查看次数: |
2039 次 |
| 最近记录: |