当前位置: 首页 > news >正文

关于setrlimit RLIMIT_STACK的一点说明

setrlimit用于限制进程资源使用,其中RLIMIT_STACK是限制栈大小的。
若栈大小超过了限制的大小,则进程会崩溃。

下面代码,设置栈大小为1024字节,然后后面又定义了2 * 1024的数组,并在print也定义了2 * 1024的数组,但是程序并没有崩溃。

#include <sys/resource.h>
#include <sys/time.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>#define BUF_LEN 2  * 1024void print(){printf("enter print function\n");int i;int length = BUF_LEN;char szBuf[BUF_LEN];for(i = 0; i < length; i++){szBuf[i] = i;}
}int main()
{struct rlimit rlimit;int ret = 0;int i = 0;int stackSize = 1  * 1024;printf("hello world\n");ret = getrlimit(RLIMIT_STACK, &rlimit);if(ret < 0){printf("getrlimit failed\n");return -1;}rlimit.rlim_cur = stackSize;rlimit.rlim_max = stackSize;ret = setrlimit(RLIMIT_STACK, &rlimit);if(ret < 0){printf("setrlimit failed\n");return -1;}printf("setrlimit succeed\n");char szBuf[BUF_LEN];int length = BUF_LEN;for(i = 0; i < length; i++){szBuf[i] = i;}printf("print\n");print();while(1);return 0;
}

通过/proc/pid/limits可以看到设置是成功的,但是程序并未崩溃。
加粗样式

后面将BUF_LEN改成2 * 1024 * 1024,stackSize设置为1 * 1024 * 1024。
运行结果为:
在这里插入图片描述
可以看到进程崩溃了,但是可以看其打印,print是打印出来的,而在print函数调用前面,有个char szBuf[BUF_LEN]的栈变量。这说明崩溃的时候,是在调用print时崩溃的(调用print时,首先会进行栈检查)。不是在main函数里面崩溃的。

其实设置RLIMIT_STACK,并不能修改当前函数调用栈帧的限制。main函数栈帧的限制在编译的时候就确定了,是8M。其生效是在后面的函数调用生成的栈帧中生效。故main函数中设置的栈大小为1M,在后面的函数print中生效。而print函数中定义了2M大小的栈变量szBuf,在main函数真正调用print时,会先进行栈限制检查。很明显未通过检查,崩溃。


http://www.mrgr.cn/news/28237.html

相关文章:

  • 【汇编语言】更灵活的定位内存地址的方法(一)—— 字符操作:and与or指令、ASCII码及大小写转换
  • 块设备的两种访问方法的区别
  • .net core开发windows程序在国产麒麟操作系统中运行
  • 【HBase原理及应用实训课程】第五章 HBase与MapReduce的集成
  • NoETL
  • 【3D Slicer】的小白入门使用指南四
  • 【Linux】调试和Git及进度条实现
  • 【C++】【网络】【Linux系统编程】单例模式,加锁封装TCP/IP协议套接字
  • 端侧大模型系列 | 斯坦福手机端侧Agent大模型,为Android API而生!
  • robomimic基础教程(一)——基本概念
  • 王道408考研数据结构-绪论
  • 排序题目:H 指数
  • 【C++】 —— string的使用
  • Linux基础---09Find文件查找
  • 智能BI项目第一期
  • Nature Geoscience 最新文章解码自然的气候护盾!植物多样性增强草地土壤温度稳定性
  • 【数据结构】图的概念和存储结构
  • Rocky Linux 9安装mysqlclient库报错的解决方法
  • 最全 高质量 大模型 -评估基准数据集(不定期更新)
  • 谷粒商城のElasticsearch
  • VLMEvalKit 评测实践:InternVL2 VS Qwen2VL
  • 01,大数据总结,zookeeper
  • 机器人相关知识的本身和价值
  • go语言中的数组指针和指针数组的区别详解
  • 『功能项目』伤害数字UI显示【53】
  • 命令行运行python时找不到模块怎么解决