首页 > 编程语言 >[c/c++]3.如何查看和更改程序运行栈的大小

[c/c++]3.如何查看和更改程序运行栈的大小

时间:2023-04-21 16:58:40浏览次数:31  
标签:限制 程序运行 RLIMIT my 更改 c++ rlimit 进程 rlim

进程内存布局

 

我们写程序运行栈的栈帧保存在栈区,函数调用深度太多将导致爆栈
栈的大小有上限,每个进程可以指定软上限,操作系统可指定硬上限

linux查看栈上限方法

  • linux可以通过ulimit命令查看栈上限和设置上限
ulimit -a 查看进程所有资源上限
ulimit -s xx 修改栈上限
  • 也可以通过程序中调用函数修改
    每个进程都有一组资源限制,其中一些可以用getrlimit和setrlimit函 数查询和更改。
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);

两个函数返回值:若成功,返回0;若出错,返回非0
这两个函数在Single UNIX Specification的XSI扩展中定义。进程 的资源限制通常是在系统初始化时由0进程建立的,然后由后续进程继 承。每种实现都可以用自己的方法对资源限制做出调整。

对这两个函数的每一次调用都指定一个资源以及一个指向下列结构 的指针。

struct rlimit {
rlim_t rlim_cur; /* soft limit: current limit */
rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */ };

在更改资源限制时,须遵循下列3条规则。
(1)任何一个进程都可将一个软限制值更改为小于或等于其硬限 制值。
(2)任何一个进程都可降低其硬限制值,但它必须大于或等于其 软限制值。这种降低,对普通用户而言是不可逆的。
(3)只有超级用户进程可以提高硬限制值。

常量RLIM_INFINITY指定了一个无限量的限制。
这两个函数的 resource 参数取下列值之一。图 7-15 显示哪些资源限 制是由 Single UNIX Specification定义并由本书讨论的4种UNIX系统实现 支持的。


 
RLIMIT_AS 进程总的可用存储空间的最大长度(字节)。这影响 到 sbrk 函数(1.11节)和mmap函数(14.8节)。

RLIMIT_CORE core文件的最大字节数,若其值为0则阻止创建core 文件。

RLIMIT_CPU CPU时间的最大量值(秒),当超过此软限制时,向 该进程发送SIGXCPU信号。

RLIMIT_DATA 数据段的最大字节长度。这是始化数据、非初始以及堆的总和。

RLIMIT_FSIZE 可以创建的文件的最大字节长度。当超过此软限制时,则向该进程发送SIGXFSZ信号。

RLIMIT_MEMLOCK 一个进程使用mlock(2)能够锁定在存储空间中
的最大字节长度。

RLIMIT_MSGQUEUE 进程为POSIX消息队列可分配的最大存储字
节数。

RLIMIT_NICE 为了影响进程的调度优先级,nice值(8.16节)可设
置的最大限制。

RLIMIT_NOFILE 每个进程能打开的最多文件数。

RLIMIT_NPROC 每个实际用户 ID 可拥有的最大子进程数。更改此 限制将影响到sysconf函数在参数_SC_CHILD_MAX中返回的值(见2.5.4 节)。

RLIMIT_SWAP 用户可消耗的交换空间的最大字节数 

RLIMIT_VMEM 这是RLIMIT_AS的同义词。

资源限制影响到调用进程并由其子进程继承。这就意味着,为了影
响一个用户的所有后续进程,需将资源限制的设置构造在shell之中。确 实,Bourne shell、GNU Bourne-again shell和Korn shell具有内置的ulimit命令,C shell具有内置limit命令。(umask和chdir函数也必须是shell内置 的。)

打印由系统支持的所有资源当前的软限制和硬限制。 为了在各种实现上编译该程序,我们已经条件地包括了各种不同的资源 名。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <sys/resource.h>

rlimit my_rlimit;

int main() {
    /*----------------------------------- get cpu rlimit ----------------------------------------*/
    int ret = getrlimit(RLIMIT_CPU, &my_rlimit);
    printf("cpu   rlimit: (%llu)  (%llu)\n", my_rlimit.rlim_cur, my_rlimit.rlim_max);
    
    /*----------------------------------- get nire rlimit ----------------------------------------*/
    ret = getrlimit(RLIMIT_AS, &my_rlimit);
    printf("AS    rlimit: (%llu)  (%llu)\n", my_rlimit.rlim_cur, my_rlimit.rlim_max);

    /*----------------------------------- get stack rlimit ----------------------------------------*/
    ret = getrlimit(RLIMIT_STACK, &my_rlimit);
    printf("stack rlimit: (%llu)  (%llu)\n", my_rlimit.rlim_cur, my_rlimit.rlim_max);

    return 0;
}
 

windows可以在编译前指定gcc 参数,修改默认栈大小

gcc -Wl,--stack=size

标签:限制,程序运行,RLIMIT,my,更改,c++,rlimit,进程,rlim
From: https://www.cnblogs.com/lidabo/p/17340999.html

相关文章

  • C++——string 成员函数 length(),size() 和 C strlen() 的区别
    //方法一:调用length()或size()stringstrTest="test";strTest.length();//4strTest.size();//4//方法二:转为C风格字符串,调用strlen()strlen(strTest.c_str());//4注意:当string中含有空字符’\0’,使用 strlen()获取stri......
  • 基于Docker的GitLab更改克隆地址问题
    解决gitlab容器上的项目进行clone时,IP地址显示一串数字而不是正常IP地址的问题问题背景通过gitlab容器创建了一个项目,想clone到本地,结果发现项目的IP地址是一串数字 问题排查明明创建项目的时候,IP地址还是正常的鸭! 再看看项目的settings 那到底要......
  • c++编译报错 error: parse error in template argument list
    [57%]BuildingCXXobjectdnet/CMakeFiles/dnet.dir/dconfig/dconfig_manager.cpp.oInfileincludedfrom/home/vi/git/dos/dnet/dconfig/dconfig_manager.cpp:1:/home/vi/git/dos/dnet/./dconfig/dconfig_manager.h:Inmemberfunction‘Tdnet::dconfig_manager::get_......
  • C++11之std::future对象的基本用法
    1、//futureexample#include<iostream>//std::cout#include<future>//std::async,std::future#include<chrono>//std::chrono::milliseconds//anon-optimizedwayofcheckingforprimenumbers:boolis_prime......
  • Python程序运行原理
    Python是一种解释型语言(先编译后解释语言),不需要编译成可执行文件,而是在运行时逐行解释执行,故运行效率相比C/C++较低。Python的运行原理可以简单地概括为以下几个步骤:词法分析和语法分析:Python解释器会将源代码进行词法分析,将代码转换为一系列的Token(即词法单元)。然后,Python......
  • IIS 内存溢出(32位程序运行)
    背景最近新接手了一个项目,服务器正常,用户量也没有变化,不定时出现内存溢出,重启iis或者回收线程就正常了review发现,因为业务原因缓存的东西并没有释放掉,但远远没有达到服务器内存上线,也没有受到预警邮件巴拉很久,发现32位系统存在内存上限为什么32位程序只能使用最大2GB内......
  • 一维与二维前缀和(蓝桥杯复习+例题讲解+模板c++)
    文章目录前缀和二维前缀和总结3956.截断数组99.激光炸弹前缀和前缀和是一种常见的算法,用于快速计算数组中某一段区间的和。前缀和的思想就是预处理出数组中前缀和,然后用后缀和减去前缀和,即可快速计算区间和。以一维数组为例,设表示数组中第个元素的值,表示数组中前个元素的......
  • 树状数组解决逆序对问题c++
    前言在算法竞赛中,求逆序对是一个常见的问题。逆序对是指在一个数列中,如果存在,且,那么就是一个逆序对。例如,数列中的逆序对有,总共有树状数组树状数组(FenwickTree)是一种高效的数据结构,用于维护数列的前缀和。树状数组的主要优势在于可以快速对数列进行单点更新和区间查询,时间......
  • 二分查找例题与模板(蓝桥杯复习+例题讲解+模板c++)
    文章目录二分模板1460.我在哪?102.最佳牛围栏113.特殊排序二分模板本文所使用的二分模板都是确保最终答案落在[L,R]以内,循环以L==R结束,每次二分的中间值会使mid成为左右区间的二者之一。单调递增序列找大于等于x的最小的值:区间的划分[l,mid][mid+1,r]while(l<r){ intmid......
  • 如何在ubuntu下更改主机名/更改ubuntu电脑名(转)
     如何在ubuntu下更改主机名/更改ubuntu电脑名(转) 如何在ubuntu下更改主机名?如何更改ubuntu的电脑名呢?如果我们安装ubuntu时随便输入了一个主机名,安装完成后感觉不好又想修改,怎么办?经过一番研究得到了修改的方法,其实很简单,只要打开/etc/hostname和/etc/network文件修改里面的老......