unix中如何查询和修改进程的资源限制

news2024/11/15 2:18:20

一、前言

一个进程在运行时,会用到各种资源,比如cpu的使用时间、内存空间、文件等等。那么,一个进程能够占用多少资源呢?cpu使用的时间有多长?进程空间有多大?能够创建多少个文件?这个就是本文需要讨论的内容。
unix系统提供了两个函数来查询和修改进程的资源限制:getrlimit、setrlimit
本文将围绕这两个函数展开讨论。

二、getrlimit

getrlimit用于查看一个进程的资源限制,其函数原型如下:

头文件:#include <sys/resource.h>
函数原型: int getrlimit(int resource, struct rlimit *rlim);
resource参数指定要查询的资源类型,比如RLIMIT_CPU(CPU时间限制)、RLIMIT_FSIZE(文件大小限制)等。
rlim是指向rlimit结构的指针,该结构用于填充查询到的限制值。 如果调用成功,getrlimit返回0。
返回值: 如果调用失败,返回-1,并且设置errno以指示错误类型。 常见的错误可能包括:
EINVAL: 指定的resource参数无效。
EPERM: 用户没有权限获取指定资源的限制。 ENOMEM: 内存不足,无法完成请求。

rlimit数据结构的定义如下:

struct rlimit {
rlim_t rlim_cur; // 软限制
rlim_t rlim_max; // 硬限制
};
软限制是当前进程可以使用的资源限制,而硬限制是一个上限,进程只能借此提升软限制。

rlim_t是一个无符号整型。
linux中支持查询的资源限制如下:

  • RLIMIT_AS 地址空间的最大大小。
  • RLIMIT_CORE 生成的核心转储文件的最大大小。
  • RLIMIT_CPU 进程可使用的最大 CPU 时间(秒)。
  • RLIMIT_DATA 进程可使用的最大数据段大小。
  • RLIMIT_FSIZE 进程可创建的最大文件大小。
  • RLIMIT_MEMLOCK 可以锁定在内存中的最大字节数。
  • RLIMIT_MSGQUEUE POSIX 消息队列的最大字节数。
  • RLIMIT_nice 进程的最大“nice”值调整。
  • RLIMIT_NOFILE 进程可以打开的最大文件描述符数。
  • RLIMIT_NPROC 进程可创建的最大子进程数。
  • RLIMIT_RSS 进程可用的最大常驻集大小。
  • RLIMIT_SBSIZE 套接字缓冲区的最大大小。
  • RLIMIT_STACK 进程的最大栈大小。

参考代码如下:

/**************************************************************************************
                     > 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用于设置进程的资源限制。其函数原型如下:

头文件:#include <sys/resource.h>
函数原型: int setrlimit(int resource, const
struct rlimit *rlim); resource: 需要设置限制的资源类型。 rlim:指向 struct rlimit 结构体的指针
返回值: 返回0代表成功设置了资源限制,返回-1代表设置失败。

参考代码如下:

**/**************************************************************************************
                     > 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权限才能修改硬限制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2153172.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数字IC设计\FPGA 职位经典笔试面试整理--基础篇1

注&#xff1a; 资料都是基于网上一些博客分享和自己学习整理而成的 1&#xff1a;什么是同步逻辑和异步逻辑&#xff1f; 同步逻辑是时钟之间有固定的因果关系。异步逻辑是各时钟之间没有固定的因果关系。 同步时序 逻辑电路的特点&#xff1a;各触发器的时钟端全部连接在一…

蚁群算法(ACO算法)求解实例---旅行商问题 (TSP)

目录 一、采用ACO求解 TSP二、 旅行商问题2.1 实际例子&#xff1a;求解 6 个城市的 TSP2.2 **求解该问题的代码&#xff0c;代码&#xff08;完整代码关注底部微信公众号获取&#xff09;**2.3 代码运行过程截屏2.4 代码运行结果截屏&#xff08;后续和其他算法进行对比&#…

Acwing数据结构:单链表

单链表 主要思想&#xff1a;使用数组实现链表(而不用结构体&#xff0c;结构体代码更长&#xff0c;后续图论也是基于数组实现&#xff09;&#xff0c;即静态链表。因为动态链表使用new申请空间需要较多的时间&#xff0c;而算法要求的是以较少的时间完成任务。 单链表&…

软件测试八股文

Part1 1、你的测试职业发展是什么&#xff1f; 测试经验越多&#xff0c;测试能力越高。所以我的职业发展是需要时间积累的&#xff0c;一步步向着高级测试工程师奔去。而且我也有初步的职业规划&#xff0c;前3年积累测试经验&#xff0c;按如何做好测试工程师的要点去要求自…

appimage 软件创建桌面快捷图标

1、appimage 软件创建桌面快捷图标 1&#xff09;下载 AppImage 文件 首先&#xff0c;确保你已经下载了 AppImage 文件&#xff0c;并且该文件具有可执行权限。你可以通过以下命令为 AppImage 文件添加可执行权限&#xff1a; chmod x /path/to/your-app.AppImage2&#xff…

大模型入门 ch04:实现一个GPT模型

本文是github上的大模型教程LLMs-from-scratch的学习笔记&#xff0c;教程地址&#xff1a;教程链接 LLM大模型主要是参数量大&#xff0c;而不是代码量大。 这是本节的具体内容 首先实现一个GPT的骨架分别实现GPT骨架内的各个部分&#xff0c;包括LayerNorm&#xff0c;GELU,…

shopro前端 短信登录只显示模板不能正常切换

删掉 换成下面的代码 // 打开授权弹框 export function showAuthModal(type smsLogin) {const modal $store(modal);setTimeout(() > {modal.$patch((state) > {state.auth type;});}, 100); }

docker操作的基本命令加容器的基本命令(仅供自己参考)

1、docker build&#xff1a;本地将一个docker文件打包成镜像 2、docker push&#xff1a;将自己打包的镜像传到镜像服务器上 3、docker pull&#xff1a;将镜像服务器上的镜像拉取到本地 4、docker images&#xff1a; 查看镜像服务器上的镜像 5、docker rmi&#xff1a;删…

编译成功!QT/6.7.2/Creator编译Windows64 MySQL驱动(MSVC版)

相邻你找了很多博文&#xff0c;都没有办法。现在终于找到了正宗。 参考 GitHub - thecodemonkey86/qt_mysql_driver: Typical symptom: QMYSQL driver not loaded. Solution: get pre-built Qt SQL driver plug-in required to establish a connection to MySQL / MariaDB u…

伊犁云计算22-1 raid 5 linux 配置

&#xff11;  添加四块&#xff53;&#xff41;&#xff54;&#xff41; 硬盘  &#xff12;  设置启动项为原来&#xff53;&#xff43;&#xff53;&#xff49; 的硬盘 &#xff13;  四块盘都是  &#xff46;&#xff44;   &#xff4c;&#xff49;&…

仓颉编程入门2,启动HTTP服务

上一篇配置了仓颉sdk编译和运行环境&#xff0c;读取一个配置文件&#xff0c;并把配置文件简单解析了一下。 前面读取配置文件&#xff0c;使用File.readFrom()&#xff0c;这个直接把文件全部读取出来&#xff0c;返回一个字节数组。然后又创建一个字节流&#xff0c;给文件…

Redis——持久化策略

Redis持久化 Redis的读写操作都是在内存上&#xff0c;所以Redis性能高。 但是当重启的时候&#xff0c;或者因为特殊情况导致Redis崩了&#xff0c;就可能导致数据的丢失。 所以Redis采取了持久化的机制&#xff0c;重启的时候利用之间持久化的文件实现数据的恢复。 Redis提…

python怎么打开编辑器

1、在电脑开始菜单中点击所有程序&#xff0c;找到Python程序&#xff0c;点击其中idle。 2、然后点击左上角的“File”&#xff0c;打开菜单&#xff0c;在下拉菜单中选择“New File”选项&#xff0c;就可打开python编辑器了。 3、在打开的python编辑器中就可以输入自己想写的…

Qwen大型语言模型系列的最新成果 ----Qwen2.5

通义千问2.5-7B-Instruct-GGUF 模型库 (modelscope.cn) apt install git-lfsgit lfs installgit clone https://www.modelscope.cn/qwen/Qwen2.5-7B-Instruct-GGUF.git

从源码到平台:食堂采购系统与供应链管理平台的开发详解

本篇文章&#xff0c;小编将从技术角度探讨如何基于源码开发一个食堂采购系统&#xff0c;并结合供应链管理平台的实现策略&#xff0c;帮助开发者与企业深入了解该系统的开发流程与关键要点。 一、食堂采购系统源码开发概述 食堂采购系统作为餐饮企业管理食材采购、库存以及…

综述论文“Towards Personalized Federated Learning”分享

综述论文“Towards Personalized Federated Learning”分享 文章目录 综述论文“Towards Personalized Federated Learning”分享I. 引言A. 联邦学习的分类B. 个性化联邦学习的动机C. 贡献 II. 个性化联邦学习的策略策略I&#xff1a;全局模型个性化策略II&#xff1a;学习个性…

无人机集群路径规划:麻雀搜索算法(Sparrow Search Algorithm, SSA)​求解无人机集群路径规划,提供MATLAB代码

一、单个无人机路径规划模型介绍 无人机三维路径规划是指在三维空间中为无人机规划一条合理的飞行路径&#xff0c;使其能够安全、高效地完成任务。路径规划是无人机自主飞行的关键技术之一&#xff0c;它可以通过算法和模型来确定无人机的航迹&#xff0c;以避开障碍物、优化…

2024年中国研究生数学建模竞赛【华为杯】C题-数据驱动下磁性元件的磁芯损耗建模(代码+讲解+成品论文+答疑)

2024年中国研究生数学建模竞赛&#xff0c;即华为杯&#xff0c;研赛正式开赛了&#xff0c;本次比赛white学长团队选择了C题&#xff0c;各位小伙伴可以根据自己的擅长选择合适题目&#xff0c;比赛过程中请注意以下时间节点&#xff1a; 华为杯比赛时间节点 一、背景 随着国民…

大小端字节序 和 内存高低地址顺序

目录 1. 大小端字节序 1.1 什么是大小端字节序&#xff1f; 1.2 为什么有大小端字节序? 1.3 习题&#xff1a;用程序结果判断大端小端 2. 各种易混淆的高低地址顺序 2.1 监视窗口的地址表示【计算机标准展示方式】 2.2 横向地址表示 2.3 一个字节 与 多个字节 的地址…

在腾讯云申请https(我得是腾讯云服务器),通过宝塔设置https

参考 一键 HTTPS&#xff1a;https://cloud.tencent.com/document/product/400/58062 DNS 验证&#xff1a;https://cloud.tencent.com/document/product/400/54500?from_cn_redirect1 申请免费的证书 访问连接&#xff1a;https://console.cloud.tencent.com/ssl 点击页…