網(wǎng)站建設(shè)制作設(shè)計(jì)seo優(yōu)化珠海比較靠譜的電商培訓(xùn)機(jī)構(gòu)
一、前言
一個(gè)進(jìn)程在運(yùn)行時(shí),會(huì)用到各種資源,比如cpu的使用時(shí)間、內(nèi)存空間、文件等等。那么,一個(gè)進(jìn)程能夠占用多少資源呢?cpu使用的時(shí)間有多長(zhǎng)?進(jìn)程空間有多大?能夠創(chuàng)建多少個(gè)文件?這個(gè)就是本文需要討論的內(nèi)容。
unix系統(tǒng)提供了兩個(gè)函數(shù)來(lái)查詢和修改進(jìn)程的資源限制:getrlimit、setrlimit
本文將圍繞這兩個(gè)函數(shù)展開(kāi)討論。
二、getrlimit
getrlimit用于查看一個(gè)進(jìn)程的資源限制,其函數(shù)原型如下:
頭文件:#include <sys/resource.h>
函數(shù)原型: int getrlimit(int resource, struct rlimit *rlim);
resource參數(shù)指定要查詢的資源類(lèi)型,比如RLIMIT_CPU(CPU時(shí)間限制)、RLIMIT_FSIZE(文件大小限制)等。
rlim是指向rlimit結(jié)構(gòu)的指針,該結(jié)構(gòu)用于填充查詢到的限制值。 如果調(diào)用成功,getrlimit返回0。
返回值: 如果調(diào)用失敗,返回-1,并且設(shè)置errno以指示錯(cuò)誤類(lèi)型。 常見(jiàn)的錯(cuò)誤可能包括:
EINVAL: 指定的resource參數(shù)無(wú)效。
EPERM: 用戶沒(méi)有權(quán)限獲取指定資源的限制。 ENOMEM: 內(nèi)存不足,無(wú)法完成請(qǐng)求。
rlimit數(shù)據(jù)結(jié)構(gòu)的定義如下:
struct rlimit {
rlim_t rlim_cur; // 軟限制
rlim_t rlim_max; // 硬限制
};
軟限制是當(dāng)前進(jìn)程可以使用的資源限制,而硬限制是一個(gè)上限,進(jìn)程只能借此提升軟限制。
rlim_t是一個(gè)無(wú)符號(hào)整型。
linux中支持查詢的資源限制如下:
- RLIMIT_AS 地址空間的最大大小。
- RLIMIT_CORE 生成的核心轉(zhuǎn)儲(chǔ)文件的最大大小。
- RLIMIT_CPU 進(jìn)程可使用的最大 CPU 時(shí)間(秒)。
- RLIMIT_DATA 進(jìn)程可使用的最大數(shù)據(jù)段大小。
- RLIMIT_FSIZE 進(jìn)程可創(chuàng)建的最大文件大小。
- RLIMIT_MEMLOCK 可以鎖定在內(nèi)存中的最大字節(jié)數(shù)。
- RLIMIT_MSGQUEUE POSIX 消息隊(duì)列的最大字節(jié)數(shù)。
- RLIMIT_nice 進(jìn)程的最大“nice”值調(diào)整。
- RLIMIT_NOFILE 進(jìn)程可以打開(kāi)的最大文件描述符數(shù)。
- RLIMIT_NPROC 進(jìn)程可創(chuàng)建的最大子進(jìn)程數(shù)。
- RLIMIT_RSS 進(jìn)程可用的最大常駐集大小。
- RLIMIT_SBSIZE 套接字緩沖區(qū)的最大大小。
- RLIMIT_STACK 進(jìn)程的最大棧大小。
參考代碼如下:
/**************************************************************************************> 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;
}
運(yùn)行結(jié)果如下圖所示:
(2-1)
ps:資源限制影響到調(diào)用進(jìn)程并由子進(jìn)程集成。也就是說(shuō)如果一個(gè)進(jìn)程修改了其資源限制,那么其子進(jìn)程也會(huì)集成這些修改后的限制。
三、setrlimit
setrlimit用于設(shè)置進(jìn)程的資源限制。其函數(shù)原型如下:
頭文件:#include <sys/resource.h>
函數(shù)原型: int setrlimit(int resource, const
struct rlimit *rlim); resource: 需要設(shè)置限制的資源類(lèi)型。 rlim:指向 struct rlimit 結(jié)構(gòu)體的指針
返回值: 返回0代表成功設(shè)置了資源限制,返回-1代表設(shè)置失敗。
參考代碼如下:
**/**************************************************************************************> 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;
}**
運(yùn)行結(jié)果如下所示:
(3-1)
Ps: 一般只能修改軟限制,硬限制需要root權(quán)限才能修改硬限制。