getrlimit Unix系统函数

Unix系统函数

名称

  getrlimit,setrlimit - 控制系统资源的最大使用量。[1]‍‍[2]

大纲

  #include <sys/resource.h>

  int getrlimit(int resource, struct rlimit *rlp);

  int setrlimit(int resource, const struct rlimit *rlp);

描述

  在操作系统中,我们能够通过函数getrlimit()、setrlimit()分别获得、设置每个进程能够创建的各种系统资源的限制使用量。

  调用getrlimit()或者setrlimit()来操作指定资源的操作上限。资源限制是一对值:一个指定了当前(软)限制,另一个则代表一个最大(硬)限制。软限制能够被一个进程改变,只要保证它不大于硬限制。一个进程能够(不能够撤回的)降低它的硬件限制,前提是大于等于软限制。仅当一个进程工作在一个系统超级用户权限下时能够提高它的硬件限制。调用setrlimit()来改变硬限制和软限制。限制值可能是一个“无穷大”值:RLIM_INFINITY。参数rlp是一个指向结构体rlimit的指针,该结构体包含如下成员:

  rlim_t rlim_cur; /*当前(软)限制*/

  rlim_t rlim_max; /*硬限制*/

  类型rlim_t是一个算术数据类型,等同于类型int,size_t,和off_t。

  资源限制类型概要描述如下:

  RLIMIT_CORE

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

  RLIMIT_CPU

  CPU时间的最大量值(秒),当超过此软限制时,向该进程发送S I G X C P U信号。

  RLIMIT_DATA

  一个进程的数据段最大字节长度。数据段中初始化数据、非初始化数据以及堆的总和。当调用函数brk动态改变一个进程的数据段大小时,若失败,errno值将被设置为ENOMEM。

  RLIMIT_FSIZE

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

  RLIMIT_NOFILE

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

  RLIMIT_STACK

  栈的最大字节长度。系统不会动态增加栈的大小限制。

  在进程内部,setrlimit()将增加限制以适合您的栈大小,而不会移动当前内存段来允许增长。为了保证进程的栈能够增长,限制必须首先改变以适应运行进程使用的新栈大小。

  在一个多线程的进程中,若在线程中调用setrlimit(),而该线程不是主线程,则对于栈的限制没有任何改变。使用参数RLIMIT_STACK来调用setrlimit()仅仅能够影响主线程的栈,并且该工作本来就应该由主线程来完成。

  当超越栈大小限制时,信号SIGSEGV会发给进程。如果进程忽略该信号,或者捕捉该信号但是没有设置处理措施,该信号默认设置为SIG_DFL处理方案。

  RLIMIT_VMEM

  可映照地址空间的最大字节长度。

  RLIMIT_AS

  进程可用内存最大字节数。

  因为限制信息存储在每个进程的信息中,shell创建限制命令必须直接调用这两个系统函数来影响该shell以后创建的所有进程。

  下面资源当前限制的值会影响相对应宏定义的展开。

  限制 宏定义展开

  RLIMIT_FSIZE FCHR_MAX

  RLIMIT_NOFILE OPEN_MAX

  当使用函数getrlimit(),如果一个资源限制能够被正确赋值为类型rlim_t,则该值将被返回;否则,如果该资源限制等同于相应的硬件限制,返回值是RLIM_SAVED_MAX;否则返回值是RLIM_SAVED_CUR。

  当使用函数setrlimit(),如果请求新的限制值为RLIM_INFINITY,新的限制将是“无限制”;否则如果请求的新的限制为RLIM_SAVED_MAX,新的限制将被保存为硬件限制;如果请求的新的限制为RLIM_SAVED_CUR,新的限制将被保存为软限制;否则新的限制将赋值为请求的值。另外,如果相应传入的限制值正确,则该限制将作为新的限制值。

  设置一个限制为RLIM_SAVED_MAX或者RLIM_SAVED_CUR的结果是未知的,除非在之前调用getrlimit以了解相应的软限制或者硬限制值。

  一个限制允许其值大于RLIM_INFINITY。

返回值

  成功完成后,getrlimit()和setrlimit()返回0。否则,返回-1并设置errno指定相应错误。

错误‍

  函数getrlimit()和函数setrlimit()失败情况如下:

  EFAULT

  参数rlp指向非法地址。

  EINVAL

  指定了一个无效的资源;或者在调用函数setrlimit()时新的rlim_cur值超过了新的rlim_max值。

  EPERM

  调用函数setrlimit试图增加最大限制值,但该进程并不属于超级用户。

  函数setrlimit可能失败情况:

  EINVAL

  指定的限制值不能去减低限制值因为当前用法已经大于该指定限制值。

你可能感兴趣的:(limit)