有的时候为了避免程序毫无意义的占用CPU(如死循环)、过度占用内存(如内存泄漏),我们可以限制程序使用的资源。
下面主要从两个角度限制资源:
- 限制程序累计运行时长
- 限制可以使用的内存大小
限制资源使用到的函数是 setrlimit,该函数限制资源的本质是当程序使用的资源超过我们限制的标准时,OS就会给运行中的程序发送信号来终止程序的运行。
目录
1、认识 setrlimit函数
2、使用 setrlimit函数限制资源
(1) 限制累计运行时长
(2) 限制可以使用的内存大小
1、认识 setrlimit函数
setrlimit 可以根据填入的参数来从不同的角度限制资源,函数声明如下:

第一个参数 resource:想要限制的资源类型。可选值如下:
| 资源类型 | 含义 | 
| RLIMIT_CPU | 限制程序的累计运行时长(即占用CPU的时长) | 
| RLIMIT_AS | 限制内存可以使用的字节数 | 
第二个参数 rlim:输入型参数。需要根据第一个参数的值,来填写相应内容,比如第一个参数填的是RLIMIT_AS,这里要填入的就是字节数;若第一个参数填的是RLIMIT_CPU,这里要填入的就是时间。结构体定义如下:
struct rlimit {
    rlim_t rlim_cur;  /* Soft limit(软件层面的限制) */
    rlim_t rlim_max;  /* Hard limit (ceiling for rlim_cur —— 软件限制的最大值) */
};
2、使用 setrlimit函数限制资源
(1) 限制累计运行时长
#include <sys/time.h>
#include <sys/resource.h>
int main(){
  struct rlimit rlim;
  rlim.rlim_cur = 1;              // 累计运行时间为1s
  rlim.rlim_max = RLIM_INFINITY;  // rlim_cur无上限
  setrlimit(RLIMIT_CPU, &rlim);
  while(1);
  return 0;
}
当前进程收到的终止信号是 6号信号

(2) 限制可以使用的内存大小
#include <sys/time.h>
#include <sys/resource.h>
#include <unistd.h>
#include <stdio.h>
int main(){
  struct rlimit rlim;    
  rlim.rlim_cur = 1024*1024*20;   // 限制当前程序可以使用的内存大小
  rlim.rlim_max = RLIM_INFINITY;  // rlim_cur无上限
  setrlimit(RLIMIT_AS, &rlim);
  int count = 0;
  while(1){
    int* a = new int[1024*1024];        // 每次申请 1024*1024*4 = 4M 的空间(一个int占4字节)
    count++;
    printf("目前已经申请的大小: %d M\n", count*4);
    sleep(1);
  }
  return 0;
}
现在限制了程序可以使用的内存大小是20M,程序在运行的时候,生成的二进制代码都是放在内存的,所以程序本身就需要占用一部分内存,因此,实际可以用于动态开辟的空间要小于20M。
当前进程收到的中止信号是24号信号。















![2023新年祝福代码[css动画特效]](https://img-blog.csdnimg.cn/46d30533ba1f4facaa594a390b6f57c7.png)




