這一部分的提出是為了防止失控的進程破壞系統的性能
nuix和Linux跟蹤進程使用的大部分資源,允許用戶和系統管理員使用對進程的資源限制
設置的限制有兩種: 硬限制和軟限制
硬限制是可以在任何時候任何進程中設置 但硬限制只能由超級用戶提起
軟限制是內核實際執行的限制,任何進程都可以將軟限制設置為任意小于等于對進程限制的硬限制的值
———————以下內容為轉載(突然發現這方面有好資源便直接引用了)—————————
getrlimit和setrlimit函數
每個進程都有一組資源限制,其中某一些可以用getrlimit和setrlimit函數查詢和更改。
#include
#include
int getrlimit(int resource,struct rlimit *rlptr);
int setrlimit(int resource,const struct rlimit rlptr);
Both return: 0 if OK,nonzero on error兩個函數
返回:若成功為0,出錯為非0
對這兩個函數的每一次調用都指定一個資源以及一個指向下列結構的指針。
struct rlimit{
rlim rlim rlimit_ur;/* 軟限制:當前限制 */
rlim rlim rlim_ax;/* 硬限制:rlimcur的最大值 */
};
可用的值
RLIMIT _AS 進程可用的內存的最大數量,包括堆棧、全局變量、動態內存
RLIMIT _CORE 內核生成的core文件的最大大小
RLIMIT _CPU 所用的全部cpu時間 以秒計算
RLIMIT _DATA 數據存儲的最大容量,以字節計算,不包括程序分配的動態存儲空間
RLIMIT _FSIZE 打開文件的最大數目
RLIMIT _MEMLOCK
RLIMIT _NOFILE
RLIMIT _NPROC 進程可以產生的最大子進程數量
RLIMIT _RSS 可以隨時使用的內存最大容量
RLIMIT _STACK 堆棧存儲區的最大容量
這兩個函數不屬于POSIX.1,但SVR4和4.3+BSD提供它們。SVR4在上面的結構中使用基本系統數據類型rlim。其它系統則將這
兩個成員定義為整型或長整型。
進程的資源限制通常是在系統初啟時由0#進程建立的,然后由后續進程繼承。在SVR4中,系統默認值可以查看文
件/etc/conf/cfd/mtune在4.3+BSD中,系統默認值分散在多個頭文件中。
在更改資源限制時,須遵循下列三條規則:
1.任何一個進程都可將一個軟限制更改為小于或等于其硬限制。
2.任何一個進程都可降低其硬限制值,但它必須大于或等于其軟限制值。這種降低,對普通用戶而言是不可逆反的。
3.只有超級用戶可以提高硬限制。
一個無限量的限制由常數RLIM NFINITY指定。
這兩個函數的resource參數取下列值之一。注意并非所有資源限制都受到SVR4和4.3+BSD的支持。
RLMITCORE(SVR4及4.3+BSD)core文件的最大字節數,若其值為0則阻止創建core文件。
RLIMIT PU(SVR4及4.3+BSD)CPU時間的最大量值(秒),當超過此軟限止時,向該進程發送SIGXCPU信號。
RLIMIT ATA(SVR4及4.3+BSD)數據段的最大字節長度。這是圖7.3中初始化數據、非初始化數據以及堆的總和。
RLIMIT SIZE(SVR4及4.3+BSD)可以創建的一個文件的最大字節長度。當超過此軟限制時,則向該進程發送SIGFSZ信號。
RLIMIT EMLOCK(4.3+BSD)鎖定在存儲器地址空間(尚末實現)。
RLIMIT OFILE(SVR4)每個進程最多打開的文件數。更改此限制將影響到sysconf函數在參數-sc-OPEN-MAX中返回的值(2.5.4節
)。見程序2.3。
RLIMIT PROC(4.3+BSD)每個實際用戶ID所擁有的最大子進程數。更改此限制將影響到sysconf函數在參數 CHILDMAX中返回的
值(2.5.4節)。
RLIMIT FILE(4.3+BSD)與SVR4的RLIMIT OFILE相同。
RLIMIT SS(4.3+BSD)最大駐內存集字節長度(RSS)。如果物理存儲器供子應求,則系統核將從進程處取回超過RSS的部分。
RLIMIT TACK(SVR4及4.3+BSD)棧的最大字節長度。見圖7.3。
RLIMIT MEM(SVR4)可映照地址空間的最大字節長度。這影響到mmap函數(12.9節)。
資源限制影響到調用進程并由其子進程繼承。這就意味著為了影響一個用戶的所有后續進程,需將資源限制設置構造在shell
之中。確實,Bourne Shell和Kornshell具有內部ulimit命令,CShell具有內部limit命令。(umask和chdir也必須是shell內部的)
。
較早的BourmeShell,例如由貝克萊提供的一種,不支持ulimit命令。較新的KornShell的ulimit命令具有-H和-s選擇項,以
分別檢查和修改硬和軟的限制,但它們尚末編寫入文檔。
?
?簡單的用例:
#include<sys/time.h>
#include<sys/resource.h>
#include<unistd.h>
int main()
{
struct rlimit limit;
char p = '1';
limit.rlim_cur = RLIM_INFINITY;
limit.rlim_max = RLIM_INFINITY;
if(setrlimit(RLIMIT_CORE, &limit))
{
printf("set limit failed/n");
}
printf("p = %s/n",p);
}
---------------------------------------------------------------------------------------------------------------------------------------------
對每個進程都有一組資源限制,其中一些可以用getrlimit和setrlimit函數查詢和更改
getrlimit和setrlimit:資源限制 (getrlimit and setrlimit: Resource Limits)
這兩個系統函數是和resource limit相關的。你用過ulimit命令嗎?(反正我沒用過)
對于每個資源來說有兩個limit:一個是hard limit,一個是soft limit,其中后者永遠不能超過前者,并且只有擁有superuser權限的進程可以更改前者。
getrlimit和setrlimit的參數相同:第一個參數是資源的類型,第二個參數是rlimit結構的指針,這個結構里面就只有兩個成員:hard limit和soft limit
幾個重要的資源類型
RLIMIT_CPU:程序執行的最大CPU時間,單位是秒。超過之后程序中止,中止的信號是SIGXCPU
RLIMIT_DATA:程序執行的最大內存
RLIMIT_NPROC:程序孵出的最大子進程數量
RLIMIT_NOFILE:程序打開的文件的最大數量
--------------------
如果你碰到類似的錯誤提示
ulimit: max user processes: cannot modify limit: 不允許的操作
ulimit: open files: cannot modify limit: 不允許的操作
為啥root用戶是可以的?普通用戶又會遇到這樣的問題?
看一下/etc/security/limits.conf大概就會明白。
linux對用戶有默認的ulimit限制,而這個文件可以配置用戶的硬配置和軟配置,硬配置是個上限。
超出上限的修改就會出“不允許的操作”這樣的錯誤。
在limits.conf加上
* soft noproc 10240
* hard noproc 10240
* soft nofile 10240
* hard nofile 10240
就是限制了任意用戶的最大線程數和文件數為10240。