一、前言
一个进程在运行时,会用到各种资源,比如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;
}
运行结果如下图所示:
 ![[图片]](https://file.cfanz.cn/uploads/png/2024/09/21/21/Udc28efac7.png)
(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;
}**
运行结果如下所示:
 ![[图片]](https://file.cfanz.cn/uploads/png/2024/09/21/21/65U116N67F.png)
(3-1)
 Ps: 一般只能修改软限制,硬限制需要root权限才能修改硬限制。










