Chinaunix首页 | 论坛 | 博客
  • 博客访问: 349043
  • 博文数量: 60
  • 博客积分: 1570
  • 博客等级: 上尉
  • 技术积分: 620
  • 用 户 组: 普通用户
  • 注册时间: 2009-11-02 23:37
文章分类

全部博文(60)

文章存档

2012年(2)

2010年(2)

2009年(56)

分类: LINUX

2009-12-13 10:09:56

1.  每个进程都有一组资源限制,其中一些可以用 getrlimit 和 setrlimit 函数查询和更改。

    #include <sys/resource.h>
int getrlimit(int resource, struct rlimit *rlptr);
int setrlimit(int resource, const struct rlimit *rlptr);
                                        Both return: 0 if OK, nonzero on error


这两个函数在 Single UNIX Specification 中定义为 XSI 扩展。进程的资源限制通常是在系统
初始化时由进程 0 建立的,然后由每个后续进程继承。每种实现都可以用自己的方法对各种限制做出调整。

    struct rlimit {
      rlim_t rlim_cur; /* soft limit: current limit */
      rlim_t rlim_max; /* hard limit: maximum value for rlim_cur */
    };


在更改资源限制时,须遵循下列三条规则:
    1)任何一个进程都可以将一个软限制值更改为 <= 其硬限制值。   
    2)任何一个进程都可降低其硬限制值,但它必须 >= 其软限制值。这种降低对普通用户而言是不可逆的。
    3)只有超级用户进程可以提高硬限制值。
   
    注意:
        1. 常量 RLIM_INFINITY 指定了一个无限量的限制。
        2. 可以使用 info ulimit 命令,查看系统支持的资源限制值(上述两个函数的第一个参数 resource)。

APUE2 上的说明:
RLIMIT_AS--    The maximum size in bytes of a process's total available memory.
               This affects the sbrk function (Section 1.11) and the mmap function.

RLIMIT_CORE-- The maximum size in bytes of a core file. A limit of 0 prevents the creation of a core file.

RLIMIT_CPU--  The maximum amount of CPU time in seconds. When the soft limit is exceeded,
                the SIGXCPU signal is sent to the process.

RLIMIT_DATA-- The maximum size in bytes of the data segment: the sum of the initialized      data, uninitialized data, and heap from Figure 7.6.

RLIMIT_FSIZE--The maximum size in bytes of a file that may be created. When the soft limit is exceeded, the process is sent the SIGXFSZ signal.

RLIMIT_LOCKS-- The maximum number of file locks a process can hold. (This number also includes file leases, a Linux-specific feature. See the Linux fcntl(2) manual page for more information.)

RLIMIT_MEMLOCK-- The maximum amount of memory in bytes that a process can lock into memory using mlock(2).

RLIMIT_NOFILE--  The maximum number of open files per process. Changing this limit affects the value returned by the sysconf function for its _SC_OPEN_MAX argument (Section 2.5.4). See Figure 2.16 also.

RLIMIT_NPROC--   The maximum number of child processes per real user ID. Changing this limit affects the value returned for _SC_CHILD_MAX by the sysconf function (Section 2.5.4).

RLIMIT_RSS--     Maximum resident set size (RSS) in bytes. If available physical memory is low, the kernel takes memory from processes that exceed their RSS.

RLIMIT_SBSIZE--  The maximum size in bytes of socket buffers that a user can consume at any given time.

RLIMIT_STACK--   The maximum size in bytes of the stack. See Figure 7.6.

RLIMIT_VMEM--    This is a synonym for RLIMIT_AS.


3. 资源限制影响到调用进程并由其子进程继承。这就意味着为了影响一个用户的所有
            后续进程,需要将资源限制的设置构造在 shell 之中。确实,Bourne shell, GNU Bourne-again shell
            和 Korn shell 具有内置的 ulimit 命令, C shell 具有内置的 limit 命令。(umask 和 cd
            也必须是 shell 内置的)
        4. 可以在 shell 中执行如下命令,查看当前的资源限制值:
            ulimit -a
        5. getrlimit 获取的长度单位是:字节。cpu 时间单位是:秒。
            ulimit 显示的出来限制值,其单位都有标注。
           
        6. 对于 RLIMIT_CORE 限制值,如果其值为 0, 则阻止创建 core 文件。
            (这是阻止创建 core 文件 5 种情况里的一种特殊情况)。

1-2. 举例说明:

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

#if defined(BSD) || defined(MACOS)
#define FMT "%10lld "
#else
#define FMT "%10ld "
#endif

#define doit(name) pr_limits(#name, name)

static void pr_limits(char *, int);

int main(int argc, char *argv[])
{
#ifdef RLIMIT_AS
        doit(RLIMIT_AS);
#endif

        doit(RLIMIT_CORE);
        doit(RLIMIT_CPU);
        doit(RLIMIT_DATA);
        doit(RLIMIT_FSIZE);

#ifdef RLIMIT_LOCKS
        doit(RLIMIT_LOCKS);
#endif

#ifdef RLIMIT_MEMLOCK
        doit(RLIMIT_MEMLOCK);
#endif

        doit(RLIMIT_NOFILE);

#ifdef RLIMIT_NPROC
        doit(RLIMIT_NPROC);
#endif

#ifdef RLIMIT_RSS
        doit(RLIMIT_RSS);
#endif

#ifdef RLIMIT_SBSIZE
        doit(RLIMIT_SBSIZE);
#endif

        doit(RLIMIT_STACK);

#ifdef RLIMIT_VMEM
        doit(RLIMIT_VMEM);
#endif

        exit(0);
}

static void pr_limits(char *name, int resource)
{
        struct rlimit limit;

        if (getrlimit(resource, &limit) != 0) {
                printf("getrlimit error for: %s: %m\n", name);
                return;
        }
        printf("%-14s ", name);
        if (limit.rlim_cur == RLIM_INFINITY)
                printf("(infinite) ");
        else
                printf(FMT, limit.rlim_cur);

        if (limit.rlim_max == RLIM_INFINITY)
                printf("(infinite) ");
        else
                printf(FMT, limit.rlim_max);
        printf("\n");
}


注意:在 doit 宏中使用了 ISO C 的字符串创建运算符(#),以便为每个资源名产生字符串值。
例如:
    doit(RLIMIT_CORE);
这将由 C 预处理程序扩展为:
pr_limits("RLIMIT_CORE", RLIMIT_CORE);


a)执行结果:Linux 2.6.21-1.3194.fc7

RLIMIT_AS       (infinite) (infinite)
RLIMIT_CORE        0       (infinite)
RLIMIT_CPU      (infinite) (infinite)
RLIMIT_DATA     (infinite) (infinite)
RLIMIT_FSIZE    (infinite) (infinite)
RLIMIT_LOCKS    (infinite) (infinite)
RLIMIT_MEMLOCK    32768      32768
RLIMIT_NOFILE     1024       1024
RLIMIT_NPROC      4096       4096
RLIMIT_RSS      (infinite) (infinite)
RLIMIT_STACK    10485760   (infinite)


b)执行 ulimit -a 命令的结果:
[root@bogon myinclude]# ulimit -a

core file size          (blocks, -c)  0
data seg size           (kbytes, -d)  unlimited
scheduling priority     (-e)          0
file size               (blocks, -f)  unlimited
pending signals         (-i)          4096
max locked memory       (kbytes, -l)  32
max memory size         (kbytes, -m)  unlimited
open files              (-n)          1024
pipe size               (512 bytes, -p) 8
POSIX message queues    (bytes, -q)   819200
real-time priority      (-r)          0
stack size              (kbytes, -s)  10240
cpu time                (seconds, -t) unlimited
max user processes      (-u)          4096
virtual memory          (kbytes, -v)  unlimited
file locks              (-x)          unlimited


阅读(2322) | 评论(0) | 转发(0) |
0

上一篇:字符串创建运算符

下一篇:系统配置限制

给主人留下些什么吧!~~