一、前言
一个进程在运行时,会用到各种资源,比如cpu的使用时间、内存空间、文件等等。那么,一个进程能够占用多少资源呢?cpu使用的时间有多长?进程空间有多大?能够创建多少个文件?这个就是本文需要讨论的内容。
unix系统提供了两个函数来查询和修改进程的资源限制:getrlimit、setrlimit
本文将围绕这两个函数展开讨论。
二、getrlimit
getrlimit用于查看一个进程的资源限制,其函数原型如下:
rlimit数据结构的定义如下:
rlim_t是一个无符号整型。
linux中支持查询的资源限制如下:
参考代码如下:
/**************************************************************************************
> File Name: rlimit.c
> Author: Conbiao
> Create Time: 2024.9.18 Wednesday
*************************************************************************************/
/**************************************************************************************
* HEADER
*************************************************************************************/
#include <stdio.h>
#include <sys/resource.h>
/**************************************************************************************
* MACRO
*************************************************************************************/
/**************************************************************************************
* FUNCTION DESCRIPTION
*************************************************************************************/
/**************************************************************************************
* MAIN
*************************************************************************************/
int main(int argc, char *argv[])
{
int ret = 0;
struct rlimit rl;
if(!getrlimit(RLIMIT_NICE,&rl))
{
printf("%s: current nice = %lu, the max nice = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get nice failed!\n",__func__);
return -1;
}
if(!getrlimit(RLIMIT_CPU,&rl))
{
printf("%s: current cpu = %lu, the max cpu = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get cpu failed!\n",__func__);
return -1;
}
if(!getrlimit(RLIMIT_NPROC,&rl))
{
printf("%s: current nproc = %lu, the max nproc = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get nproc failed!\n",__func__);
return -1;
}
return ret;
}
运行结果如下图所示:
(2-1)
ps:资源限制影响到调用进程并由子进程集成。也就是说如果一个进程修改了其资源限制,那么其子进程也会集成这些修改后的限制。
三、setrlimit
setrlimit用于设置进程的资源限制。其函数原型如下:
参考代码如下:
**/**************************************************************************************
> File Name: rlimit.c
> Author: Conbiao
> Create Time: 2024.9.18 Wednesday
*************************************************************************************/
/**************************************************************************************
* HEADER
*************************************************************************************/
#include <stdio.h>
#include <sys/resource.h>
/**************************************************************************************
* MACRO
*************************************************************************************/
/**************************************************************************************
* FUNCTION DESCRIPTION
*************************************************************************************/
/**************************************************************************************
* MAIN
*************************************************************************************/
int main(int argc, char *argv[])
{
int ret = 0;
struct rlimit rl;
if(!getrlimit(RLIMIT_NICE,&rl))
{
printf("%s: current nice = %lu, the max nice = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get nice failed!\n",__func__);
return -1;
}
if(!getrlimit(RLIMIT_CPU,&rl))
{
printf("%s: current cpu = %lu, the max cpu = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get cpu failed!\n",__func__);
return -1;
}
if(!getrlimit(RLIMIT_NPROC,&rl))
{
printf("%s: current nproc = %lu, the max nproc = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get nproc failed!\n",__func__);
return -1;
}
if(!getrlimit(RLIMIT_NOFILE,&rl))
{
printf("%s: current nofile = %lu, the max nofile = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get nofile failed!\n",__func__);
return -1;
}
rl.rlim_cur = 2048;
//rl.rlim_max = 1048577;
if(!setrlimit(RLIMIT_NOFILE,&rl))
{
printf("%s: set rlimit success!\n",__func__);
if(!getrlimit(RLIMIT_NOFILE,&rl))
{
printf("%s: new current nofile = %lu, the max nofile = %lu \n",__func__,rl.rlim_cur,rl.rlim_max);
}
else
{
printf("%s: get nofile failed!\n",__func__);
return -1;
}
}
else
{
return -1;
}
return ret;
}**
运行结果如下所示:
(3-1)
Ps: 一般只能修改软限制,硬限制需要root权限才能修改硬限制。