Linux 资源限制 setrlimit

本文介绍了如何使用Linux系统调用setrlimit来限制程序的资源消耗,包括累计运行时长和内存大小。通过设置RLIMIT_CPU限制程序运行时长,超时后会发送6号信号终止程序。而通过RLIMIT_AS限制内存大小,当程序内存使用超过设定值时,会发送24号信号结束程序。这两个限制对于防止程序无休止地占用CPU和内存资源非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有的时候为了避免程序毫无意义的占用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号信号。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值