每个进程都需要进行资源限制,避免把系统搞垮(比如对CPU的使用,硬盘空间的占用等等)。基于这个目的,Linux内核在每个进程的进程描述符中还应该包含资源限制的数据结构,Linux使用了一个数组成员,该数组成员的包含关系为current->signal->rlim,数组的定义如下所示:
struct rlimit rlim[RLIM_NLIMITS];
其中,rlimit结构的定义为:
struct rlimit {
__kernel_ulong_t rlim_cur;
__kernel_ulong_t rlim_max;
};
__kernel_ulong_t等于无符号长整形。RLIM_NLIMITS的大小为16,也就是说,目前对进程资源的限制有16种,分别如下所示:
结构体成员rlim_cur表示对当前进程的资源限制。比如current->signal->rlim[RLIMIT_CPU].rlim_cur
是指当前正在运行的进程的CPU时间限制。
成员rlim_max表示资源限制允许的最大值。可以通过getrlimit()和setrlimit()系统调用进行设置,用户可以增加rlim_max的值到rlim_max。但是,超级用户(更准确地讲,具有CAP_SYS_RESOURCE能力的用户)可以增加rlim_max的值,或者将rlim_cur设为超过rlim_max的值。
这就是为什么当我们的程序崩溃时,却发现没有core文件,这是因为系统默认是关闭的。所以需要调用命令
ulimit -c unlimited // 设置core文件大小为不限制大小
然后才能看到core文件的原因。
但是,我们查看源码的时候会发现,大部分的资源限制都被设为RLIM_INFINITY(0xffffffff),这意味对资源没有用户限制(当然了,本身还要受到硬件的限制:比如可用的RAM,硬盘实际空间等等)。这是因为我们想要保留软件设置的自由度,如果代码中直接定义对硬件资源的限制,软件操作的空间就会变小。
通过上面的方法,系统管理员可以更改对资源的限制。当用户登陆到系统时,内核创建一个超级用户拥有的进程,通过它调用setrlimit()减小rlim_max和rlim_cur的值;然后执行login shell,成为用户态进程(实际就是进程init)。用户新创建的进程继承它父进程的rlim数组内容,所以,用用也不能覆盖掉由超级用户赋值的限制值。
本文分享自 嵌入式ARM和Linux 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有