码迷,mamicode.com
首页 > 系统相关 > 详细

第5章 进程环境(4)_进程资源限制

时间:2017-01-28 21:19:25      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:无限   ack   /proc   oid   clu   资源   作用   printf   size   

5. 进程资源限制

(1)getrlimit、setrlimit函数

头文件

#include<sys/resource.h>

函数

int* getrlimit(int resource, struct rlimit* rlptr);

返回值

成功返回0,出错返回非0

功能

获得资源限制,存放在rlptr指向的结构体中

参数

(1)rlimit结构体

struct rlimit{
    rlim_t  rlim_cur;    //软限制:当前限制
    rlim_t  rlim_max;  //硬限制:rlim_cur的最大值
}

(2)resource的取值:见后面的表格。

 

函数

int setrlimit(int resource, const struct rlimit* rlptr);

返回值

成功返回0,出错返回非0

功能

通过rlptr指向的结构体去修改resource指定的资源限制

备注

资源限制影响到调用进程并由其子进程继承。

(2)resource取值

作用

RLIMIT_AS

进程可用存储区大小

RLIMIT_CORE

core文件最大字节数

RLIMIT_CPU

CPU时间最大值

RLIMIT_DATA

数据段最大长度

RLIMIT_FSIZE

可创建文件的最大长度。当超过此软限制时,则向该进程发送SIGXFSZ信号

RLIMIT_LOCKS

文件锁的最大数

RLIMIT_MEMLOCK

使用mlock能够锁定在存储器中的最长字节数

RLIMIT_NOFILE

能打开的最大文件数

RLIMIT_NPROC

每个用户ID可拥有的最大子进程数

RLIMIT_RSS

最大驻内存集的字节长度

RLIMIT_STACT

栈的最大长度

【编程实验】显示进程资源限制情况

//process_limit.c

#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>

#define RLIMIT(name)   get_limit(#name, name);

void get_limit(char* name, int resource)
{
    struct rlimit limit;
    if(getrlimit(resource, &limit) < 0){
        perror("getrlimit error");
        return;
    }

    printf("%-15s", name);  //左对齐打印资源的名字
    //rlmit_cur:软资源限制
    if(limit.rlim_cur == RLIM_INFINITY){
        printf("    infinity");  //无限制
    }else{
        printf("%10ld", limit.rlim_cur);
    }
    //rlimit_max:硬资源限制
    if(limit.rlim_max == RLIM_INFINITY){
        printf("    infinity");  //无限制
    }else{
        printf("%10ld", limit.rlim_max);
    }
    printf("\n");
}

int main(int argc, char* argv[])
{
    RLIMIT(RLIMIT_AS);       //进程可用存储区大小
    RLIMIT(RLIMIT_CORE);     //core文件最大字节数
    RLIMIT(RLIMIT_CPU);      //CPU时间最大值
    RLIMIT(RLIMIT_DATA);     //数据段最大长度
    RLIMIT(RLIMIT_FSIZE);    //可创建文件的最大长度
    RLIMIT(RLIMIT_LOCKS);    //文件锁的最大数
    RLIMIT(RLIMIT_MEMLOCK);  //使用mlock能在存储器中锁定的最长字节数
    RLIMIT(RLIMIT_NOFILE);   //能打开的最大文件数
    RLIMIT(RLIMIT_NPROC);    //每个用户ID可拥有的最大子进程数
    RLIMIT(RLIMIT_RSS);      //最大驻内存集的字节长度
    RLIMIT(RLIMIT_STACK);    //栈的最大长度
    
    return 0;
}

(3)进程资源限制的配置文件

  ①/etc/security/limits.conf

  ②Linux中进程资源的初始化由0号进程建立被后续进程继承

(4)资源限制的修改规则

  ①硬资源限制必须大于等于软资源限制

  ②任何一进程可以降低或者提升其软资源限制,但必须小于等于硬资源限制

  ③任何一进程可以降低其硬资源限制,但必须大于其软限制,普通户不可逆此操作。

  ④只有超级用户可以提高硬限制

【编程实验】限制进程打开文件的最大数量

//limit_nofile.c

#include <unistd.h>
#include <sys/resource.h>
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>

#define MODE S_IRWXU | S_IRWXG | S_IRWXO

int open_file(const char* filename)
{
    int fd = open(filename, O_RDWR | O_CREAT | O_TRUNC, MODE);
    if(fd < 0){
        perror("open error");
        exit(1);
    }

    return fd;
}

int main(int argc, char* argv[])
{
    struct rlimit limit;
    limit.rlim_cur = 4;     //设置软资源限制
    limit.rlim_max = 1024;  //设置硬资源限制

    //设置进程打开文件的最大数
    //(注:0==>标准输入 1==标准输出 2==>标准错误 己打开)
    if(setrlimit(RLIMIT_NOFILE, &limit) < 0){
        perror("setrlimit error");
        exit(1);
    }

    //打开文件
    int fd1, fd2;
    fd1 = open_file("s1.txt"); //正常打开
    if(fd1 < 0){
        exit(1);
    }

    fd2 = open_file("s2.txt");//超过软资源限制指定的4个文件,则报错。
    if(fd2 < 0){
        exit(1);
    }

    close(fd1);
    close(fd2);
    
    return 0;
}

 

第5章 进程环境(4)_进程资源限制

标签:无限   ack   /proc   oid   clu   资源   作用   printf   size   

原文地址:http://www.cnblogs.com/5iedu/p/6354483.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!