吾爱程序员:这里有好玩的游戏和软件
当前位置:首页操作系统教程 → 在 C 中获取/设置进程资源限制

在 C 中获取/设置进程资源限制

来源:网络 | 更新时间:2022-02-28 21:05:12
getrlimit()setrlimit()系统调用可用于获取和设置与进程相关的资源限制,例如文件、CPU、内存等。 每个资源都有一个关联的软限制和硬限制。
  • 软限制软限制是内核对相应资源实施的实际限制。
  • 硬限制硬限制充当软限制的上限。
软限制介于 0 和硬限制之间。 这两个限制由以下结构定义

struct rlimit {
rlim_t rlim_cur; /* Soft limit */
rlim_t rlim_max; /* Hard limit (ceiling for rlim_cur) */
};
系统调用的签名是

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);
resource是指您要检索或修改的资源限制。 设置这两个限制,请将具有新值的值设置为 rlimit 结构的元素。 获得这两个限制,请传递 rlim 的地址。成功调用 getrlimit(),将 rlimit 元素设置为限制。成功时,两者都 返回0。在error时,返回-1,并适当设置 errno。 这里,是一个通过将大于最大文件描述符数的值 1 更改为 3 来演示系统调用的程序。
// C program to demonstrate working of getrlimit() 
// and setlimit()
#include <stdio.h>
#include <sys/resource.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {

struct rlimit old_lim, lim, new_lim;

// Get old limits
if( getrlimit(RLIMIT_NOFILE, &old_lim) == 0)
printf("Old limits -> soft limit= %ld t"
" hard limit= %ld n", old_lim.rlim_cur, 
old_lim.rlim_max);
else
fprintf(stderr, "%sn", strerror(errno));

// Set new value
lim.rlim_cur = 3;
lim.rlim_max = 1024;

// Set limits
if(setrlimit(RLIMIT_NOFILE, &lim) == -1)
fprintf(stderr, "%sn", strerror(errno));

// Get new limits
if( getrlimit(RLIMIT_NOFILE, &new_lim) == 0)
printf("New limits -> soft limit= %ld "
"t hard limit= %ld n", new_lim.rlim_cur, 
new_lim.rlim_max);
else
fprintf(stderr, "%sn", strerror(errno));
return 0;
}
输出:
Old limits -> soft limit= 1048576      hard limit= 1048576 
New limits -> soft limit= 3              hard limit= 1024
旧限值可能因系统而异。 现在,如果您尝试打开一个新文件,它将显示运行时错误,因为最多可以打开 3 个文件并且系统已经打开了(STDIN、STDOUT、STDERR)。
// C program to demonstrate error when a 
// process tries to access resources beyond
// limit.
#include <stdio.h>
#include <sys/resource.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main() {

struct rlimit old_lim, lim, new_lim;

// Get old limits
if( getrlimit(RLIMIT_NOFILE, &old_lim) == 0)
printf("Old limits -> soft limit= %ld t"
" hard limit= %ld n", old_lim.rlim_cur,
old_lim.rlim_max);
else
fprintf(stderr, "%sn", strerror(errno));

// Set new value
lim.rlim_cur = 3;
lim.rlim_max = 1024;


// Set limits
if(setrlimit(RLIMIT_NOFILE, &lim) == -1)
fprintf(stderr, "%sn", strerror(errno));

// Get new limits
if( getrlimit(RLIMIT_NOFILE, &new_lim) == 0)
printf("New limits -> soft limit= %ld t"
" hard limit= %ld n", new_lim.rlim_cur, 
new_lim.rlim_max);
else
fprintf(stderr, "%sn", strerror(errno));

// Try to open a new file
if(open("foo.txt", O_WRONLY | O_CREAT, 0) == -1)
fprintf(stderr, "%sn", strerror(errno));
else
printf("Opened successfullyn");

return 0;
}
输出:
Old limits -> soft limit= 1048576      hard limit= 1048576
New limits -> soft limit= 3                      hard limit= 1024
Too many open files
还有另一个系统调用prlimit()结合了这两个系统调用。 有关更多详细信息,请通过键入查看手册
man 2 prlimit

最新文章

热点资讯

手游排行榜

CopyRight 2020-2030吾爱程序员

鄂ICP备2021004581号-8

本站资源收集于网络,如有侵权请联系我们:35492删除0109@qq.com