加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

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

发布时间:2020-12-13 19:47:38 所属栏目:Linux 来源:网络整理
导读:我有个疑问. 我打开内核,然后更改了目录linux-3.1.1 / fs / open.c 我在open.c中更改了以下代码. SYSCALL_DEFINE3(open,const char __user *,filename,int,flags,mode){ long ret; printk(KERN_EMERG "Testingn"); ... } 我只把这行:printk(KERN_EMERG“Te
我有个疑问.

我打开内核,然后更改了目录linux-3.1.1 / fs / open.c

我在open.c中更改了以下代码.

SYSCALL_DEFINE3(open,const char __user *,filename,int,flags,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);
}

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

unistd.h,fcntl.h,stdio.h,stdlib.h

感谢你们.

解决方法

But I don′t understand why the “Testing” didn’t appeared on the 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)

所以,由于开放的系统调用非常受欢迎(只是做一个strace -e open / bin / ls – 我将获得15个开放的系统调用来启动最简单的ls),速率限制将生效.它将限制您的信息仅在5秒内打印一次;单个“爆发”中不超过10条消息.

我只能建议创建一个具有已知UID的特殊用户,并在printk中添加一个UID检查,并在其他printk-in-open代码中添加.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读