关于进程资源限制的getrlimit和setrlimit函数(epoll、服务器经常用)
getrlimit和setrlimit
?
頭文件
#include <sys/resource.h>
?
函數原型
int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
?
功能
每個進程都有一組資源限制,其中一部分可以通過getrlimit和setrlimit函數查詢和更改。進程資源限制通常是在初始化時由進程0建立的,然后由每個后繼進程繼承。每種實現都可以對各種限制做出調整。
?
參數
struct rlimit {
? ? rlim_t rlim_cur; ?/* Soft limit(軟限制) */
? ? rlim_t rlim_max; ?/* Hard limit (硬限制,是軟限制的上限)(ceiling for rlim_cur) */
};
?
/*resource參數的取值可為下列其一*/
RLIMIT_AS ??//進程虛擬內存(地址空間,Address Space)的最大字節長度。該限制會影響brk、mmap和mremap等。
RLIMIT_CORE ??//core文件的最大字節長度。超出這個大小的core文件會被截短。指定0則表示不產生core文件。
RLIMIT_CPU ???//CPU時間的使用限制(秒)。進程達到軟限制時,會收到一個SIGXCPU信號(默認會終止進程。但進程可以捕獲該信號)。如果進程繼續消耗CPU時間,它會每秒收到一個SIGXCPU信號,直到達到硬限制,并接收到SIGKILL信號(不同的實現在此處可能會有差別)。
RLIMIT_DATA ???//進程數據段(初始化數據節、未初始化數據節和堆)的最大字節長度。該限制會影響brk和sbrk等。
RLIMIT_FSIZE ??//進程所能創建的文件的最大字節長度。
RLIMIT_LOCKS ?//進程可創建的flock鎖和fcntl租借鎖的總數(租借鎖是Linux特有的:fcntl可通過F_SETLEASE命令對文件加讀或寫的租借鎖。當另一個進程嘗試打開或截短該文件而產生沖突時,內核會通過信號通知持有租借鎖的進程。后者應當對此作出響應,如flush緩沖區或移除租借鎖等)。
RLIMIT_MEMLOCK ??//進程使用mlock能夠鎖定在RAM中的最大字節長度(防止被換出到交換分區。內存的鎖定和解鎖以頁為單位)。該限制會影響mlock、mlockall和mmap等。
RLIMIT_MSGQUEUE ??//調用進程的實際用戶所能分配的Posix消息隊列的最大字節長度。
RLIMIT_NICE ???//進程可通過setpriority() 或 nice()調用設置的最大完美值。linux 2.6.12+
RLIMIT_NOFILE ?//進程所能打開(如使用open/pipe/socket)的文件描述符的最大值加1。注意,進程間的文件描述符是獨立的。超出該限制會拋出EMFILE錯誤。
RLIMIT_NPROC ??//調用進程的實際用戶所能創建進程(在Linux上,更準確的說法是線程)的最大數目。超出該限制時,fork會失敗并拋出EAGAIN錯誤。
RLIMIT_RSS ???//最大駐內存集字節長度(RSS)
RLIMIT_RTPRIO ???//進程可通過sched_setscheduler 和 sched_setparam設置的最大實時優先級。
RLIMIT_SIGPENDING ??//用戶可擁有的最大掛起信號數。
RLIMIT_STACK ???//最大的進程堆棧,以字節為單位。
規則(unix中的規則要求)
1.任何進程都可以將一個軟限制更改為小于或等于其硬限制值。
2.對于普通用戶來說,任何進程都可降低其硬限制值,但必須大于等于軟限制值。
3.只有超級用戶進程可以提高硬限制值。
?
例子
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
?
#if defined(BSD) || defined(MACOS)
#include <sys/time.h>
#define FMT "%101ld"
#else
#define FMT "%10ld"
#endif
#include <sys/resource.h>
?
#define doit(name) pr_limits(#name, name)
?
static void pr_limits(char *, int);
?
int main(void)
{
#ifdef RLIMIT_AS
?? ?doit(RLIMIT_AS);
#endif
?? ?doit(RLIMIT_CORE);
?? ?doit(RLIMIT_CPU);
?? ?doit(RLIMIT_DATA);
?? ?doit(RLIMIT_FSIZE);
#ifdef RLIMIT_LOCKS
?? ?doit(RLIMIT_LOCKS);
#endif
#ifdef RLIMIT_MEMLOCK
?? ?doit(RLIMIT_MEMLOCK);
#endif
?? ?doit(RLIMIT_NOFILE);
#ifdef RLIMIT_NPROC
?? ?doit(RLIMIT_NPROC);
#endif
#ifdef RLIMIT_RSS
?? ?doit(RLIMIT_RSS);
#endif
#ifdef RLIMIT_SBSIZE
?? ?doit(RLIMIT_SBSIZE);
#endif
?? ?doit(RLIMIT_STACK);
#ifdef RLIMIT_VMEM
?? ?doit(RLIMIT_VMEM);
#endif
?? ?exit(0);
}
?
static void pr_limits(char *name, int resource)
{
?? ?struct rlimit limit;
?
?? ?if(getrlimit(resource, &limit) < 0)
?? ?{
?? ??? ?printf("getrlimit error for %s", name);
?? ?}
?? ?printf("%-14s ? ",name);
?? ?if(limit.rlim_cur == RLIM_INFINITY)
?? ?{
?? ??? ?printf("(infinite) ? ?");
?? ?}
?? ?else
?? ?{
?? ??? ?printf(FMT, limit.rlim_cur);
?? ?}
?
?? ?if(limit.rlim_max == RLIM_INFINITY)
?? ?{
?? ??? ?printf("(infinite) ? ");
?? ?}
?? ?else
?? ?{
?? ??? ?printf(FMT, limit.rlim_max);
?? ?}
?? ?putchar((int)'\n');
}
?
?
epoll例子
#define MAXEPOLLSIZE 10000
int listener, new_fd, kdpfd, nfds, n, ret, curfds;
socklen_t len;
struct sockaddr_in my_addr,their_addr;
struct epoll_event ev;
struct epoll_event pevent[MAXEPOLLSIZE];
struct rlimit rt;
rt.rlim_max = rt.rlim_cur = MAXEPOLLSIZE;
?? ?
if (setrlimit(RLIMIT_NOFILE, &rt) == -1)
{
?? ???perror("setrlimit");
?? ???exit(1);
}
else
{
?? ???printf("設置系統資源參數成功!\n");
}
總結
以上是生活随笔為你收集整理的关于进程资源限制的getrlimit和setrlimit函数(epoll、服务器经常用)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 18.IDA-创建自己的sig(创建自己
- 下一篇: 共享内存进程线程混合通信