C语言系统资源控制(getrlimit && setrlimit)

每一个进程都有自己的一组资源限制,在(*)inux系统中我们可以通过
#include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
这2个API来取得和设置资源
getrlimit用来取得setrlimit用来设置 这二个参数都需要一个要控制的资源比如控制CPU、内存、文件描述符个数等等的控制,作为第一个参数传入,第二个参数是一个rlimit的结构体地址(指针),他的结构如下定义:
定义放在头文件/usr/include/bits/resource.h中
struct rlimit
      {
        
        rlim_t rlim_cur;
        
        rlim_t rlim_max;
      };
结构体中rlim_cur是要取得或设置的资源软限制的值,rlim_max是硬限制
这两个值的设置有一个小的约束:
1) 任何进程可以将软限制改为小于或等于硬限制
2)任何进程都可以将硬限制降低,但普通用户降低了就无法提高,该值必须等于或大于软限制
3) 只有超级用户可以提高硬限制
一个无限的限制由常量RLIM_INFINITY指定(The      value      RLIM_INFINITY      denotes no limit on a resource )

RLIMIT_AS
                  The      maximum      size      of      the      process鈙      virtual memory (address
                  space) inbytes.      This limit affects callsto      brk(2),      mmap(2)
                  and      mremap(2), which fail with the error ENOMEM upon exceeding
                  this limit. Also automatic stack expansion will fail(and      gen-
                  erate      a SIGSEGV that kills the process when no alternate stack
                  has been madeavailable).       Since      the      value      is           long,      on
                  machines with a 32-bit long either this limit is at most 2GiB,
                  or this resource is unlimited.
RLIMIT_CORE
                  Maximum size of core file. When 0 no core dumpfiles      are      cre-
                  ated.      When nonzero, larger dumps are truncated to thissize.
设定最大的core文件,当值为0时将禁止core文件非0时将设定产生的最大core文件大小为设定的值
RLIMIT_CPU
                  CPU      time      limit inseconds.      When the process reaches the soft
                  limit, it is sent a SIGXCPUsignal.       The      default      action      for
                  this      signal      is to terminate theprocess.      However, the signal
                  can be caught, and the handler can return controlto      the      main
                  program.      If the process continues to consume CPU time, it will
                  be sentSIGXCPU      once      per      second      until      the      hard      limit      is
                  reached,      at which time it is sentSIGKILL.      (This latter point
                  describes Linux 2.2 and 2.4behaviour.      Implementations vary in
                  how      they      treat      processes      which continue to consume CPU time
                  after reaching the softlimit.      Portable applications that need
                  to catch this signal should perform an orderly terminationupon
                  first receipt of SIGXCPU.)
CPU时间的最大量值(秒),当超过此软限制时向该进程发送SIGXCPU信号
RLIMIT_DATA

                  The maximum size ofthe      process鈙      data      segment      (initialized
                  data,      uninitialized data, andheap).      This limit affects calls
                  to brk() and sbrk(), whichfail      with      the      error      ENOMEM      upon
                  encountering the soft limit of thisresource.
数据段的最大字节长度
RLIMIT_FSIZE
                  The      maximum      size      of      files      that      the      process      may      create.
                  Attempts to extend a file beyond this limit resultin      delivery
                  of a SIGXFSZsignal.      By default, this signal terminates a pro-
                  cess, but a process can catchthis      signal      instead,      in      which
                  case the relevant system call (e.g., write(), truncate())fails
                  with the error EFBIG.
可以创建的文件的最大字节长度,当超过此软限制时向进程发送SIGXFSZ
RLIMIT_MEMLOCK

                  The maximum number ofbytes      of      virtual      memory      that      may      be
                  locked into RAM using mlock() and mlockall().
RLIMIT_NOFILE
                  Specifies      a value one greater than the maximum file descriptor
                  number that can be opened by thisprocess.       Attempts      (open(),
                  pipe(),      dup(),      etc.)       to      exceed      this limit yield the error
                  EMFILE.
每个进程能够打开的最多文件数。更改此限制将影响到sysconf函数在参数_SC_CHILD_MAX中的返回值
RLIMIT_OFILE is the BSD name for RLIMIT_NOFILE.
这里BSD系统中RLIMIT_NOFILE的别名
RLIMIT_NPROC

                  The maximum number of processes thatcan      be      created      for      the
                  real      user      ID      of the callingprocess.      Upon encountering this
                  limit, fork() fails with the errorEAGAIN.
每个实际用户ID所拥有的最大子进程数,更改此限制将影响到sysconf函数在参数_SC_CHILD_MAX中返回的值
RLIMIT_RSS

                  Specifies the limit (in pages) ofthe      process鈙      resident      set
                  (the number of virtual pages resident inRAM).      This limit only
                  has effect in Linux 2.4 onwatrds, and there onlyaffects      calls
                  to madvise() specifyingMADVISE_WILLNEED.
最大驻内存集字节长度(RSS)如果物理存储器供不应求则内核将从进程处取回超过RSS的部份
RLIMIT_STACK

                  The maximum size of the process stack, inbytes.      Upon reaching
                  this limit, a SIGSEGV signal isgenerated.      To handle this sig-
                  nal,           process must employ an alternate signal stack (sigalt-
                  stack(2)).
栈的最大长度
RLIMIT——VMEM可映照地址空间的最大字节长茺,这影响到mmap函数
这些限制影响到调用进程并由子进程继承!可以在SHELL中预设这些值ulimit命令设置

小试牛刀(代码只是演示,并没有作错误处理)
请在文本框输入文字#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/resource.h>
int main(void)
{
 
   struct rlimit r;
    if(getrlimit(RLIMIT_NOFILE,&r)<0)
    {
        fprintf(stderr,"getrlimit errorn");
        exit(1);
    }
    printf("RLIMIT_NOFILE cur:%dn",r.rlim_cur);
    printf("RLIMIT_NOFILE max:%dn",r.rlim_max);

    
    r.rlim_cur=100;
    r.rlim_max=200;
    if (setrlimit(RLIMIT_NOFILE,&r)<0)
    {
        fprintf(stderr,"setrlimit errorn");
        exit(1);
    }

    
    if(getrlimit(RLIMIT_NOFILE,&r)<0)
    {
        fprintf(stderr,"getrlimit errorn");
        exit(1);
    }
    printf("RLIMIT_NOFILE cur:%dn",r.rlim_cur);
    printf("RLIMIT_NOFILE max:%dn",r.rlim_max);
    return 0;
}

:!gcctest.c  

:!./a.out
RLIMIT_NOFILE cur:1024
RLIMIT_NOFILE max:1024
RLIMIT_NOFILE cur:100
RLIMIT_NOFILE max:200


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值