getrlimit(2) - wariua/manpages-ko GitHub Wiki

NAME

getrlimit, setrlimit, prlimit - ์ž์› ์ œํ•œ ์–ป๊ธฐ/์„ค์ •ํ•˜๊ธฐ

SYNOPSIS

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

int getrlimit(int resource, struct rlimit *rlim);
int setrlimit(int resource, const struct rlimit *rlim);

int prlimit(pid_t pid, int resource, const struct rlimit *new_limit,
            struct rlimit *old_limit);

glibc ๊ธฐ๋Šฅ ํ™•์ธ ๋งคํฌ๋กœ ์š”๊ฑด (feature_test_macros(7) ์ฐธ๊ณ ):

prlimit():
_GNU_SOURCE

DESCRIPTION

getrlimit() ๋ฐ setrlimit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ์ž์› ์ œํ•œ์„ ์–ป๊ณ  ์„ค์ •ํ•œ๋‹ค. ๊ฐ ์ž์›์—๋Š” ์—ฐ์„ฑ(soft) ์ œํ•œ๊ณผ ๊ฒฝ์„ฑ(hard) ์ œํ•œ์ด ์žˆ์œผ๋ฉฐ rlimit ๊ตฌ์กฐ์ฒด๋„ ๊ทธ๋ ‡๊ฒŒ ์ •์˜๋ผ ์žˆ๋‹ค.

struct rlimit {
    rlim_t rlim_cur;  /* ์—ฐ์„ฑ ์ œํ•œ */
    rlim_t rlim_max;  /* ๊ฒฝ์„ฑ ์ œํ•œ (rlim_cur์˜ ์ƒํ•œ) */
};

์—ฐ์„ฑ ์ œํ•œ์€ ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•ด ์ปค๋„์ด ๊ฐ•์ œํ•˜๋Š” ๊ฐ’์ด๋‹ค. ๊ฒฝ์„ฑ ์ œํ•œ์€ ์—ฐ์„ฑ ์ œํ•œ์˜ ์ƒํ•œ ์—ญํ• ์„ ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋น„ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๋Š” ์ž๊ธฐ ์—ฐ์„ฑ ์ œํ•œ์„ 0์—์„œ ๊ฒฝ์„ฑ ์ œํ•œ๊นŒ์ง€ ๋ฒ”์œ„์˜ ๊ฐ’์œผ๋กœ๋งŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ž๊ธฐ ๊ฒฝ์„ฑ ์ œํ•œ์„ (๋น„๊ฐ€์—ญ์ ์œผ๋กœ) ๋‚ฎ์ถœ ์ˆ˜๋งŒ ์žˆ๋‹ค. ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๋Š” (๋ฆฌ๋ˆ…์Šค์—์„œ: ์ตœ์ดˆ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ CAP_SYS_RESOURCE ์—ญ๋Šฅ์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค๋Š”) ์–ด๋А ์ชฝ ์ œํ•œ๊ฐ’์ด๋“  ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋‹ค.

RLIM_INFINITY ๊ฐ’์€ (getrlimit()๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ตฌ์กฐ์ฒด์™€ setrlimit()๋กœ ์ฃผ๋Š” ๊ตฌ์กฐ์ฒด ๋ชจ๋‘์—์„œ) ์ž์›์— ์ œํ•œ์ด ์—†์Œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.

resource ์ธ์ž๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜์—ฌ์•ผ ํ•œ๋‹ค.

RLIMIT_AS
ํ”„๋กœ์„ธ์Šค ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ (์ฃผ์†Œ ๊ณต๊ฐ„) ์ตœ๋Œ€ ํฌ๊ธฐ์ด๋‹ค. ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ œํ•œ๊ฐ’์„ ์ง€์ •ํ•˜๊ณ  ์‹œ์Šคํ…œ ํŽ˜์ด์ง€ ํฌ๊ธฐ ๋ฐฐ์ˆ˜๋กœ ๋‚ด๋ฆผ ํ•œ๋‹ค. ์ด ์ œํ•œ์ด brk(2), mmap(2), mremap(2)์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ ์ œํ•œ ์ดˆ๊ณผ ์‹œ ENOMEM ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค. ๋”๋ถˆ์–ด ์ž๋™ ์Šคํƒ ํ™•์žฅ์ด ์‹คํŒจํ•œ๋‹ค. (์ด ๊ฒฝ์šฐ sigaltstack(2)์„ ํ†ตํ•ด ๋Œ€์ฒด ์Šคํƒ์„ ๋งˆ๋ จํ•ด ๋‘์ง€ ์•Š์•˜์œผ๋ฉด ์ƒ์„ฑ๋˜๋Š” SIGSEGV๊ฐ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฃฝ์ธ๋‹ค.) ๊ฐ’์ด long์ด๋ฏ€๋กœ 32๋น„ํŠธ long์„ ์“ฐ๋Š” ๋จธ์‹ ์—์„œ๋Š” ์ด ์ œํ•œ์ด ์ตœ๋Œ€ 2 GiB์ด๋“ ์ง€ ์•„๋‹ˆ๋ฉด ์ด ์ž์›์— ์ œํ•œ์ด ์—†๋‹ค.
RLIMIT_CORE
ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ตœ๋Œ€๋กœ ๋คํ”„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”์–ด ํŒŒ์ผ(core(5) ์ฐธ๊ณ )์˜ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ํฌ๊ธฐ์ด๋‹ค. 0์ด๋ฉด ์ฝ”์–ด ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜์ง€ ์•Š๋Š”๋‹ค. 0์ด ์•„๋‹ˆ๋ฉด ๊ทธ๋ณด๋‹ค ํฐ ๋คํ”„๊ฐ€ ๊ทธ ํฌ๊ธฐ๋กœ ์ž˜๋ฆฐ๋‹ค.
RLIMIT_CPU
ํ”„๋กœ์„ธ์Šค๊ฐ€ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ๋Š” CPU ์‹œ๊ฐ„ ์–‘์— ๋Œ€ํ•œ ์ดˆ ๋‹จ์œ„ ์ œํ•œ์ด๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฐ์„ฑ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด SIGXCPU ์‹œ๊ทธ๋„์„ ๋ฐ›๋Š”๋‹ค. ์ด ์‹œ๊ทธ๋„์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ๋™์ž‘์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ์‹œ๊ทธ๋„์„ ์žก์„ ์ˆ˜ ์žˆ๊ณ  ํ•ธ๋“ค๋Ÿฌ์—์„œ ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ œ์–ด๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† CPU ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋ฉด ์ผ ์ดˆ๋งˆ๋‹ค SIGXCPU๋ฅผ ๋ฐ›๋‹ค๊ฐ€ ๊ฒฝ์„ฑ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด ์ด๋ฒˆ์—” SIGKILL์„ ๋ฐ›๋Š”๋‹ค. (๋’ค์ชฝ ์„ค๋ช…์€ ๋ฆฌ๋ˆ…์Šค์˜ ๋™์ž‘ ๋ฐฉ์‹์ด๋‹ค. ์—ฐ์„ฑ ์ œํ•œ์— ๋„๋‹ฌํ•˜๊ณ ๋„ ๊ณ„์† CPU ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋‹ค๋ฃจ๋Š”์ง€๋Š” ๊ตฌํ˜„์— ๋”ฐ๋ผ ๋‹ค๋ฅด๋‹ค. ์ด ์‹œ๊ทธ๋„์„ ์žก์•„์•ผ ํ•˜๋Š” ์ด์‹์„ฑ ์žˆ๋Š” ์‘์šฉ์—์„œ๋Š” SIGXCPU๋ฅผ ์ฒ˜์Œ ๋ฐ›์•˜์„ ๋•Œ ์งˆ์„œ์ •์—ฐํ•˜๊ฒŒ ์ข…๋ฃŒ๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.)
RLIMIT_DATA
ํ”„๋กœ์„ธ์Šค ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ(์ดˆ๊ธฐํ™” ๋œ ๋ฐ์ดํ„ฐ, ์ดˆ๊ธฐํ™” ์•ˆ ๋œ ๋ฐ์ดํ„ฐ, ํž™)์˜ ์ตœ๋Œ€ ํฌ๊ธฐ์ด๋‹ค. ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ œํ•œ์„ ์ง€์ •ํ•˜๋ฉฐ ์‹œ์Šคํ…œ ํŽ˜์ด์ง€ ํฌ๊ธฐ ๋ฐฐ์ˆ˜๋กœ ๋‚ด๋ฆผ ํ•œ๋‹ค. ์ด ์ œํ•œ์ด brk(2), sbrk(2), (๋ฆฌ๋ˆ…์Šค 4.7๋ถ€ํ„ฐ) mmap(2)์— ์˜ํ–ฅ์„ ์ฃผ๋ฉฐ ์ด ์ž์›์˜ ์—ฐ์„ฑ ์ œํ•œ์„ ๋งŒ๋‚˜๋ฉด ENOMEM ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค.
RLIMIT_FSIZE
ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ์˜ ๋ฐ”์ดํŠธ ๋‹จ์œ„ ์ตœ๋Œ€ ํฌ๊ธฐ์ด๋‹ค. ์ด ์ œํ•œ์„ ๋„˜๊ฒจ์„œ ํŒŒ์ผ์„ ํ™•์žฅํ•˜๋ ค๊ณ  ํ•˜๋ฉด SIGXFSZ ์‹œ๊ทธ๋„์„ ๋ฐ›๋Š”๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ์‹œ๊ทธ๋„์€ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค์—์„œ ์‹œ๊ทธ๋„์„ ์žก์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ ๊ฒฝ์šฐ ํ•ด๋‹น ์‹œ์Šคํ…œ ํ˜ธ์ถœ(๊ฐ€๋ น write(2), truncate(2))์ด EFBIG ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•˜๊ฒŒ ๋œ๋‹ค.
RLIMIT_LOCKS (์ดˆ๊ธฐ ๋ฆฌ๋ˆ…์Šค 2.4์—์„œ๋งŒ)
ํ”„๋กœ์„ธ์Šค์—์„œ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” flock(2) ๋ฝ ๊ฐœ์ˆ˜์™€ fcntl(2) ๋ฆฌ์Šค ์ˆ˜๋ฅผ ํ•ฉ์นœ ๊ฒƒ์— ๋Œ€ํ•œ ์ œํ•œ์ด๋‹ค.
RLIMIT_MEMLOCK

RAM์— ์ตœ๋Œ€๋กœ ๊ณ ์ •ํ•ด ๋‘˜ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์ดํŠธ ์ˆ˜์ด๋‹ค. ์ด ์ œํ•œ๊ฐ’์„ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด ์‹œ์Šคํ…œ ํŽ˜์ด์ง€ ํฌ๊ธฐ ๋ฐฐ์ˆ˜๋กœ ๋‚ด๋ ค์„œ ์ ์šฉํ•œ๋‹ค. ์ด ์ œํ•œ์ด mlock(2), mlockall(2), mmap(2) MAP_LOCKED ๋™์ž‘์— ์˜ํ–ฅ์„ ์ค€๋‹ค. ๋ฆฌ๋ˆ…์Šค 2.6.9๋ถ€ํ„ฐ๋Š” shmctl(2) SHM_LOCK ๋™์ž‘์—๋„ ์˜ํ–ฅ์„ ์ฃผ๋Š”๋ฐ, ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID๊ฐ€ ๊ณ ์ •ํ•ด ๋‘˜ ์ˆ˜ ์žˆ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ์„ธ๊ทธ๋จผํŠธ(shmget(2) ์ฐธ๊ณ ) ๋ฐ”์ดํŠธ ์ดํ•ฉ์˜ ์ƒํ•œ์„ ์„ค์ •ํ•œ๋‹ค. shmctl(2) SHM_LOCK ๋ฐฉ์‹ ๊ณ ์ •์€ mlock(2), mlockall(2), mmap(2) MAP_LOCKED๋กœ ์„ค์ •ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋ณ„ ๋ฉ”๋ชจ๋ฆฌ ๊ณ ์ •๊ณผ๋Š” ๋”ฐ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. ์ฆ‰ ํ•œ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋‘ ๊ธฐ์ค€ ๊ฐ๊ฐ์—์„œ ์ด ์ œํ•œ๊นŒ์ง€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋ฆฌ๋ˆ…์Šค ์ปค๋„ 2.6.9 ์ „์—์„œ๋Š” ์ด ์ œํ•œ์ด ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ํ†ต์ œํ–ˆ๋‹ค. ๋ฆฌ๋ˆ…์Šค 2.6.9๋ถ€ํ„ฐ๋Š” ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์— ์–ด๋–ค ํ•œ๊ณ„๋„ ๋‘์ง€ ์•Š์œผ๋ฉฐ ์ด ์ œํ•œ์€ ๋น„ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ํ†ต์ œํ•œ๋‹ค.

RLIMIT_MSGQUEUE (๋ฆฌ๋ˆ…์Šค 2.6.8๋ถ€ํ„ฐ)

ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID๋ณ„๋กœ POSIX ๋ฉ”์‹œ์ง€ ํ์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ”์ดํŠธ ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์ด๋‹ค. mq_open(3)์— ์ด ์ œํ•œ์ด ์ ์šฉ๋œ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ๋“œ๋Š” ๋ฉ”์‹œ์ง€ ํ ๊ฐ๊ฐ์— ๋Œ€ํ•ด (์ œ๊ฑฐํ•˜๊ธฐ ์ „๊นŒ์ง€) ๋‹ค์Œ ์‹์— ๋”ฐ๋ผ ๊ณ„์‚ฐํ•ด์„œ ์ด ์ œํ•œ์„ ์ ์šฉํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค 3.5๋ถ€ํ„ฐ:
```c bytes = attr.mq_maxmsg * sizeof(struct msg_msg) + min(attr.mq_maxmsg, MQ_PRIO_MAX) * sizeof(struct posix_msg_tree_node)+ /* ์˜ค๋ฒ„ํ—ค๋“œ */ attr.mq_maxmsg * attr.mq_msgsize; /* ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ */ ```
๋ฆฌ๋ˆ…์Šค 3.4 ๋ฐ ์ด์ „:
```c bytes = attr.mq_maxmsg * sizeof(struct msg_msg *) + /* ์˜ค๋ฒ„ํ—ค๋“œ */ attr.mq_maxmsg * attr.mq_msgsize; /* ๋ฉ”์‹œ์ง€ ๋ฐ์ดํ„ฐ */ ```

์—ฌ๊ธฐ์„œ attr์€ mq_open(3)์— ๋„ค ๋ฒˆ์งธ ์ธ์ž๋กœ ์ง€์ •ํ•˜๋Š” mq_attr ๊ตฌ์กฐ์ฒด์ด๋ฉฐ msg_msg ๋ฐ posix_msg_tree_node ๊ตฌ์กฐ์ฒด๋Š” ์ปค๋„ ๋‚ด๋ถ€์šฉ ๊ตฌ์กฐ์ฒด์ด๋‹ค.

์œ„ ์‹์—์„œ "์˜ค๋ฒ„ํ—ค๋“œ" ๋ถ€๋ถ„์€ ๊ตฌํ˜„์—์„œ ํ•„์š”๋กœ ํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐ”์ดํŠธ ์ˆ˜์— ํ•ด๋‹นํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธธ์ด 0์ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฌดํ•œ์ • ๋งŒ๋“ค ์ˆ˜ ์—†๊ฒŒ ํ•œ๋‹ค. (๊ทธ๋Ÿฐ ๋ฉ”์‹œ์ง€ ์—ญ์‹œ๋„ ๊ฐ๊ฐ ์œ ์ง€์— ์–ผ๋งˆ๊ฐ„์˜ ์‹œ์Šคํ…œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋“ ๋‹ค.)

RLIMIT_NICE (๋ฆฌ๋ˆ…์Šค 2.6.12๋ถ€ํ„ฐ, ๋‹จ ์•„๋ž˜ BUGS ์ฐธ๊ณ )
setpriority(2)๋‚˜ nice(2)๋กœ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ํ”„๋กœ์„ธ์Šค ๋‚˜์ด์Šค ๊ฐ’์˜ ์ƒํ•œ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์‹ค์ œ ๋‚˜์ด์Šค ๊ฐ’ ์ƒํ•œ์€ 20 - rlim_cur๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์ด ์ œํ•œ์— ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฒ”์œ„๋Š” 1(๋‚˜์ด์Šค ๊ฐ’ 19์— ๋Œ€์‘)์—์„œ 40(๋‚˜์ด์Šค ๊ฐ’ -20์— ๋Œ€์‘)๊นŒ์ง€๋‹ค. ๋ฒ”์œ„๋ฅผ ์ด๋ ‡๊ฒŒ ํŠน์ดํ•˜๊ฒŒ ์ •ํ•œ ๊ฑด ๋ณดํ†ต ํŠน์ˆ˜ํ•œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ์Œ์ˆ˜๋ฅผ ์ž์› ์ œํ•œ๊ฐ’์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด RLIM_INFINITY๋Š” ๋ณดํ†ต -1๊ณผ ๊ฐ™๋‹ค. ๋‚˜์ด์Šค ๊ฐ’์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ sched(7) ์ฐธ๊ณ .
RLIMIT_NOFILE

์ด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ตœ๋Œ€๋กœ ์—ด ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๊ฐœ์ˆ˜๋ณด๋‹ค 1๋งŒํผ ํฐ ๊ฐ’์„ ์ง€์ •ํ•œ๋‹ค. ์ด ์ œํ•œ์„ ์ดˆ๊ณผํ•˜๋ ค๋Š” ์‹œ๋„(open(2), pipe(2), dup(2) ๋“ฑ)๋Š” EMFILE ์˜ค๋ฅ˜๋ฅผ ์ผ์œผํ‚ค๊ฒŒ ๋œ๋‹ค. (BSD์—์„œ๋Š” ์ด ์ œํ•œ์˜ ์ด๋ฆ„์ด RLIMIT_OFILE์ธ ์ ์ด ์žˆ์—ˆ๋‹ค.)

๋ฆฌ๋ˆ…์Šค 4.5๋ถ€ํ„ฐ๋Š” (CAP_SYS_RESOURCE ์—ญ๋Šฅ ์—†๋Š”) ๋น„ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์œ ๋‹‰์Šค ๋„๋ฉ”์ธ ์†Œ์ผ“์œผ๋กœ ์ „๋‹ฌํ•ด์„œ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค๋กœ "์ด์†ก ์ค‘"์ผ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์˜ ์ตœ๋Œ€ ๊ฐœ์ˆ˜๊นŒ์ง€ ์ด ์ œํ•œ์œผ๋กœ ๊ทœ์ •๋œ๋‹ค. sendmsg(2) ์‹œ์Šคํ…œ ํ˜ธ์ถœ์— ์ด ์ œํ•œ์ด ์ ์šฉ๋œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ unix(7) ์ฐธ๊ณ .

RLIMIT_NPROC

ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID๋ณ„ ํ˜„์กด ํ”„๋กœ์„ธ์Šค(์ •ํ™•ํžˆ ๋งํ•ด ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์Šค๋ ˆ๋“œ) ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์ด๋‹ค. ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID์—๊ฒŒ ์†ํ•œ ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค ์ˆ˜๊ฐ€ ์ด ์ œํ•œ๊ฐ’ ์ด์ƒ์ธ ๋™์•ˆ์—๋Š” fork(2)๊ฐ€ EAGAIN์œผ๋กœ ์‹คํŒจํ•œ๋‹ค.

CAP_SYS_ADMIN์ด๋‚˜ CAP_SYS_RESOURCE ์—ญ๋Šฅ์„ ๊ฐ€์ง„ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ๋Š” RLIMIT_NPROC ์ œํ•œ์ด ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.

RLIMIT_RSS
ํ”„๋กœ์„ธ์Šค ์ƒ์ฃผ ์ง‘ํ•ฉ(๋žจ์— ์ƒ์ฃผํ•˜๋Š” ๊ฐ€์ƒ ํŽ˜์ด์ง€ ์ˆ˜)์— ๋Œ€ํ•œ (๋ฐ”์ดํŠธ ๋‹จ์œ„) ์ œํ•œ์ด๋‹ค. ๋ฆฌ๋ˆ…์Šค 2.4.x (x < 30)์—์„œ๋งŒ ํšจ๋ ฅ์ด ์žˆ์œผ๋ฉฐ MADV_WILLNEED๋ฅผ ์ง€์ •ํ•œ madvise(2) ํ˜ธ์ถœ์—๋งŒ ์˜ํ–ฅ์„ ์ค€๋‹ค.
RLIMIT_RTPRIO (๋ฆฌ๋ˆ…์Šค 2.6.12๋ถ€ํ„ฐ, ๋‹จ BUGS ์ฐธ๊ณ )

sched_setscheduler(2)์™€ sched_setparam(2)์œผ๋กœ ํ”„๋กœ์„ธ์Šค์— ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ์‹ค์‹œ๊ฐ„ ์šฐ์„ ์ˆœ์œ„์˜ ์ƒํ•œ์„ ์ง€์ •ํ•œ๋‹ค.

์‹ค์‹œ๊ฐ„ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ sched(7) ์ฐธ๊ณ .

RLIMIT_RTTIME (๋ฆฌ๋ˆ…์Šค 2.6.25๋ถ€ํ„ฐ)

์‹ค์‹œ๊ฐ„ ์Šค์ผ€์ค„๋ง ์ •์ฑ… ํ•˜์˜ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ธ”๋กœํ‚น ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ถ€๋ฅด์ง€ ์•Š์€ ์ฑ„๋กœ ์†Œ๋ชจํ•  ์ˆ˜ ์žˆ๋Š” CPU ์‹œ๊ฐ„ ์–‘์— ๋Œ€ํ•œ (๋งˆ์ดํฌ๋กœ์ดˆ ๋‹จ์œ„) ์ œํ•œ์ด๋‹ค. ์ด ์ œํ•œ์˜ ๋ชฉ์ ์ƒ ๋ธ”๋ก ํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ถ€๋ฅผ ๋•Œ๋งˆ๋‹ค ์†Œ๋ชจ CPU ์‹œ๊ฐ„์ด 0์œผ๋กœ ์žฌ์„ค์ •๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† CPU๋ฅผ ์ด์šฉํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ ์„ ์ ๋˜๊ฑฐ๋‚˜, ํƒ€์ž„ ์Šฌ๋ผ์ด์Šค๊ฐ€ ๋งŒ๋ฃŒ๋˜๊ฑฐ๋‚˜, sched_yield(2)๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” CPU ์‹œ๊ฐ„์ด ์žฌ์„ค์ •๋˜์ง€ ์•Š๋Š”๋‹ค.

์—ฐ์„ฑ ์ œํ•œ ๋„๋‹ฌ ์‹œ ํ”„๋กœ์„ธ์Šค๊ฐ€ SIGXCPU ์‹œ๊ทธ๋„์„ ๋ฐ›๋Š”๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ด ์‹œ๊ทธ๋„์„ ์žก๊ฑฐ๋‚˜ ๋ฌด์‹œํ•˜๊ณ ์„œ ๊ณ„์† CPU ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋ฉด ์ผ ์ดˆ๋งˆ๋‹ค SIGXCPU๋ฅผ ๋ฐ›๋‹ค๊ฐ€ ๊ฒฝ์„ฑ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด ์ด๋ฒˆ์—” SIGKILL ์‹œ๊ทธ๋„์„ ๋ฐ›๋Š”๋‹ค.

์ด ์ œํ•œ์˜ ๊ธฐ๋ณธ ์šฉ๋„๋Š” ์ œ์–ด ๋ถˆ๋Šฅ์ธ ์‹ค์‹œ๊ฐ„ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋ฉˆ์ถฐ์„œ ์‹œ์Šคํ…œ์ด ๋จนํ†ต์ด ๋˜์ง€ ์•Š๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์‹ค์‹œ๊ฐ„ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ sched(7) ์ฐธ๊ณ .

RLIMIT_SIGPENDING (๋ฆฌ๋ˆ…์Šค 2.6.8๋ถ€ํ„ฐ)
ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID๋ณ„๋กœ ํ์— ๋“ค์–ด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ทธ๋„ ์ˆ˜์— ๋Œ€ํ•œ ์ œํ•œ์ด๋‹ค. ์ด ์ œํ•œ์„ ํ™•์ธํ•˜๋Š” ๋ฐ ์žˆ์–ด์„  ํ‘œ์ค€ ์‹œ๊ทธ๋„๊ณผ ์‹ค์‹œ๊ฐ„ ์‹œ๊ทธ๋„์„ ํ•จ๊ป˜ ์„ผ๋‹ค. ํ•˜์ง€๋งŒ ์ œํ•œ์ด ์ ์šฉ๋˜๋Š” ๊ฑด sigqueue(3)์—์„œ๋งŒ์ด๋‹ค. ์ฆ‰ ์–ธ์ œ๋“  kill(2)์„ ์‚ฌ์šฉํ•ด์„œ ํ์— ๋“ค์–ด ์žˆ์ง€ ์•Š๋˜ ์‹œ๊ทธ๋„ ์ข…๋ฅ˜์˜ ์ธ์Šคํ„ด์Šค ํ•˜๋‚˜๋ฅผ ํ์— ๋„ฃ๋Š” ๊ฒŒ ๊ฐ€๋Šฅํ•˜๋‹ค.
RLIMIT_STACK

ํ”„๋กœ์„ธ์Šค ์Šคํƒ ์ตœ๋Œ€ ํฌ๊ธฐ์ด๊ณ  ๋ฐ”์ดํŠธ ๋‹จ์œ„๋‹ค. ์ด ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด SIGSEGV ์‹œ๊ทธ๋„์ด ์ƒ์„ฑ๋œ๋‹ค. ํ”„๋กœ์„ธ์Šค์—์„œ ์ด ์‹œ๊ทธ๋„์„ ๋‹ค๋ฃจ๋ ค๋ฉด ๋Œ€์ฒด ์‹œ๊ทธ๋„ ์Šคํƒ(sigaltstack(2))์„ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

๋ฆฌ๋ˆ…์Šค 2.6.23๋ถ€ํ„ฐ๋Š” ํ”„๋กœ์„ธ์Šค ๋ช…๋ นํ–‰ ์ธ์ž ๋ฐ ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์“ฐ์ด๋Š” ๊ณต๊ฐ„์˜ ์–‘๊นŒ์ง€ ์ด ์ œํ•œ์ด ๊ฒฐ์ •ํ•œ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ execve(2) ์ฐธ๊ณ .

prlimit()

๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ธ prlimit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ setrlimit()์™€ getrlimit()์˜ ๊ธฐ๋Šฅ์„ ํ•ฉ์น˜๊ณ  ํ™•์žฅํ•œ ๊ฒƒ์ด๋‹ค. ์ด๊ฑธ ์“ฐ๋ฉด ์ž„์˜ ํ”„๋กœ์„ธ์Šค์˜ ์ž์› ์ œํ•œ์„ ์„ค์ •ํ•˜๋ฉด์„œ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

resource ์ธ์ž์˜ ์˜๋ฏธ๋Š” setrlimit() ๋ฐ getrlimit()์—์„œ์™€ ๊ฐ™๋‹ค.

new_limit ์ธ์ž๊ฐ€ NULL์ด ์•„๋‹ˆ๋ฉด ๊ฐ€๋ฆฌํ‚ค๋Š” rlimit ๊ตฌ์กฐ์ฒด๋ฅผ ์จ์„œ resource์— ๋Œ€ํ•œ ์—ฐ์„ฑ ๋ฐ ๊ฒฝ์„ฑ ์ œํ•œ์— ์ƒˆ ๊ฐ’์„ ์„ค์ •ํ•œ๋‹ค. old_limit ์ธ์ž๊ฐ€ NULL์ด ์•„๋‹ˆ๋ฉด prlimit() ์„ฑ๊ณต ํ˜ธ์ถœ ์‹œ resource์— ๋Œ€ํ•œ ์ด์ „ ์—ฐ์„ฑ ๋ฐ ๊ฒฝ์„ฑ ์ œํ•œ๊ฐ’์ด old_limit๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” rlimit ๊ตฌ์กฐ์ฒด์— ๋“ค์–ด๊ฐ„๋‹ค.

pid ์ธ์ž๋Š” ํ˜ธ์ถœ์ด ๋™์ž‘ํ•  ํ”„๋กœ์„ธ์Šค์˜ ID๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. pid๊ฐ€ 0์ด๋ฉด ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ ํ˜ธ์ถœ์ด ์ ์šฉ๋œ๋‹ค. ์ž๊ธฐ ์™ธ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์˜ ์ œํ•œ๊ฐ’์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ์–ป์œผ๋ ค๋ฉด ์ž์› ์ œํ•œ์ด ๋ณ€๊ฒฝ๋  ํ”„๋กœ์„ธ์Šค์˜ ์‚ฌ์šฉ์ž ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํ˜ธ์ถœ์ž๊ฐ€ CAP_SYS_RESOURCE ์—ญ๋Šฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ, ์‹คํšจ, saved set ์‚ฌ์šฉ์ž ID๊ฐ€ ํ˜ธ์ถœ์ž์˜ ์‹ค์ œ ์‚ฌ์šฉ์ž ID์™€ ์ผ์น˜ํ•˜๊ณ  ๋™์‹œ์— ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ ์‹ค์ œ, ์‹คํšจ, saved set ๊ทธ๋ฃน ID๊ฐ€ ํ˜ธ์ถœ์ž์˜ ์‹ค์ œ ๊ทธ๋ฃน ID์™€ ์ผ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

RETURN VALUE

์„ฑ๊ณต ์‹œ ์ด ์‹œ์Šคํ…œ ํ˜ธ์ถœ๋“ค์€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์˜ค๋ฅ˜ ์‹œ -1์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ errno๋ฅผ ์ ์ ˆํžˆ ์„ค์ •ํ•œ๋‹ค.

ERRORS

EFAULT
ํฌ์ธํ„ฐ ์ธ์ž๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„ ๋ฐ–์˜ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.
EINVAL
resource์— ์ง€์ •ํ•œ ๊ฐ’์ด ์œ ํšจํ•˜์ง€ ์•Š๋‹ค. ๋˜๋Š” setrlimit()๋‚˜ prlimit()์—์„œ rlim->rlim_cur์ด rlim->rlim_max๋ณด๋‹ค ํฌ๋‹ค.
EPERM
๋น„ํŠน๊ถŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฒฝ์„ฑ ์ œํ•œ์„ ์˜ฌ๋ฆฌ๋ ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ ค๋ฉด CAP_SYS_RESOURCE ์—ญ๋Šฅ์ด ํ•„์š”ํ•˜๋‹ค.
EPERM
ํ˜ธ์ถœ์ž๊ฐ€ RLIMIT_NOFILE ์ œํ•œ์„ /proc/sys/fs/nr_open(proc(5) ์ฐธ๊ณ )์— ๊ทœ์ •๋œ ์ตœ๋Œ€์น˜ ๋„ˆ๋จธ๋กœ ์˜ฌ๋ฆฌ๋ ค๊ณ  ํ–ˆ๋‹ค.
EPERM
(prlimit()) ํ˜ธ์ถœ ํ”„๋กœ์„ธ์Šค์—๊ฒŒ pid๋กœ ์ง€์ •ํ•œ ํ”„๋กœ์„ธ์Šค์˜ ์ œํ•œ๊ฐ’์„ ์„ค์ •ํ•  ๊ถŒํ•œ์ด ์—†๋‹ค.
ESRCH
pid์— ์ง€์ •ํ•œ ID์˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค.

VERSIONS

๋ฆฌ๋ˆ…์Šค 2.6.36๋ถ€ํ„ฐ prlimit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. glibc 2.13๋ถ€ํ„ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›์ด ์ œ๊ณต๋œ๋‹ค.

ATTRIBUTES

์ด ์ ˆ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์šฉ์–ด๋“ค์— ๋Œ€ํ•œ ์„ค๋ช…์€ attributes(7)๋ฅผ ๋ณด๋ผ.

์ธํ„ฐํŽ˜์ด์Šค ์†์„ฑ ๊ฐ’
getrlimit(), setrlimit(), prlimit() ์Šค๋ ˆ๋“œ ์•ˆ์ „์„ฑ MT-Safe

CONFORMING TO

getrlimit(), setrlimit(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

prlimit(): ๋ฆฌ๋ˆ…์Šค ์ „์šฉ.

RLIMIT_MEMLOCK๊ณผ RLIMIT_NPROC์€ BSD์—์„œ ์˜จ ๊ฒƒ์ด๋ฉฐ POSIX.1์—๋Š” ๋ช…์„ธ๋ผ ์žˆ์ง€ ์•Š๋‹ค. BSD ๊ณ„์—ด๊ณผ ๋ฆฌ๋ˆ…์Šค์—๋Š” ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ๊ตฌํ˜„์—๋Š” ๊ฑฐ์˜ ์—†๋‹ค. RLIMIT_RSS๋Š” BSD์—์„œ ์˜จ ๊ฒƒ์ด๋ฉฐ POSIX.1์—๋Š” ๋ช…์„ธ๋ผ ์žˆ์ง€ ์•Š๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋‹ค์ˆ˜ ๊ตฌํ˜„๋“ค์— ์กด์žฌํ•œ๋‹ค. RLIMIT_MSGQUEUE, RLIMIT_NICE, RLIMIT_RTPRIO, RLIMIT_RTTIME, RLIMIT_SIGPENDING์€ ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

fork(2)๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋œ ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ์˜ ์ž์› ์ œํ•œ๋“ค์„ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค. execve(2)๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ ์ž์› ์ œํ•œ๋“ค์ด ๋ณด์กด๋œ๋‹ค.

์ž์› ์ œํ•œ์€ ํ”„๋กœ์„ธ์Šค๋ณ„ ์†์„ฑ์ด๋ฏ€๋กœ ํ”„๋กœ์„ธ์Šค ๋‚ด ๋ชจ๋“  ์Šค๋ ˆ๋“œ๊ฐ€ ๊ณต์œ ํ•œ๋‹ค.

์ž์›์˜ ์—ฐ์„ฑ ์ œํ•œ์„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ํ˜„์žฌ ๊ทธ ์ž์›์„ ์“ฐ๊ณ  ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋‚ฎ๊ฒŒ ๋‚ด๋ ค๋„ ์„ฑ๊ณตํ•œ๋‹ค. (ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ทธ ์ž์› ์‚ฌ์šฉ๋Ÿ‰์„ ๋” ๋†’์ด์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค.)

์…ธ์˜ ๋‚ด์žฅ ๋ช…๋ น ulimit(csh(1)์—์„œ๋Š” limit)์„ ์‚ฌ์šฉํ•ด ์…ธ์˜ ์ž์› ์ œํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์…ธ์—์„œ ๋ช…๋ น ์‹คํ–‰์„ ์œ„ํ•ด ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋“ค์ด ๊ทธ ์ž์› ์ œํ•œ์„ ๋ฌผ๋ ค๋ฐ›๋Š”๋‹ค.

๋ฆฌ๋ˆ…์Šค 2.6.24๋ถ€ํ„ฐ /proc/[pid]/limits๋ฅผ ํ†ตํ•ด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค์˜ ์ž์› ์ œํ•œ๊ฐ’์„ ๋“ค์—ฌ๋‹ค๋ณผ ์ˆ˜ ์žˆ๋‹ค. proc(5) ์ฐธ๊ณ .

์•„์ฃผ ์˜›๋‚  ์‹œ์Šคํ…œ์—์„  setrlimit()๊ณผ ์šฉ๋„๊ฐ€ ๋น„์Šทํ•œ vlimit() ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ–ˆ๋‹ค. ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด glibc์—์„œ๋„ vlimit()๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ƒˆ๋กœ ์ž‘์„ฑํ•˜๋Š” ์‘์šฉ์€ ๋ชจ๋‘ setrlimit()์„ ์“ฐ๋„๋ก ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/์ปค๋„ ABI ์ฐจ์ด

๋ฒ„์ „ 2.12๋ถ€ํ„ฐ glibc์˜ getrlimit() ๋ฐ setrlimit() ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ๋Š” ๋” ์ด์ƒ ๋Œ€์‘ํ•˜๋Š” ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๋ถ€๋ฅด์ง€ ์•Š๊ณ  ๋Œ€์‹  prlimit()์„ ์ด์šฉํ•œ๋‹ค. ์ด๋Š” BUGS์—์„œ ์„ค๋ช…ํ•˜๋Š” ์ด์œ ๋“ค ๋•Œ๋ฌธ์ด๋‹ค.

glibc ๋ž˜ํผ ํ•จ์ˆ˜์˜ ์ด๋ฆ„์ด prlimit()์ด๋‹ค. ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ prlimit64()์ด๋‹ค.

BUGS

๊ตฌ์‹ ๋ฆฌ๋ˆ…์Šค ์ปค๋„๋“ค์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ ์—ฐ์„ฑ ๋ฐ ๊ฒฝ์„ฑ RLIMIT_CPU ์ œํ•œ์„ ๋งŒ๋‚ฌ์„ ๋•Œ (CPU ์‚ฌ์šฉ ์‹œ๊ฐ„์œผ๋กœ) ์ผ ์ดˆ ๋Šฆ๊ฒŒ SIGXCPU ๋ฐ SIGKILL ์‹œ๊ทธ๋„์ด ์ „๋‹ฌ๋œ๋‹ค. ์ปค๋„ 2.6.8์—์„œ ์ˆ˜์ •๋๋‹ค.

2.6.x ์ปค๋„์—์„œ 2.6.17 ์ „๊นŒ์ง€์—์„œ๋Š” RLIMIT_CPU ์ œํ•œ๊ฐ’ 0์„ (RLIM_INFINITY์ฒ˜๋Ÿผ) "์ œํ•œ ์—†์Œ"์œผ๋กœ ์ž˜๋ชป ์ฒ˜๋ฆฌํ•œ๋‹ค. 2.6.17๋ถ€ํ„ฐ ์ œํ•œ๊ฐ’์„ 0์œผ๋กœ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ํšจ๋ ฅ์ด ์—†๋‹ค. ๋‹จ ์‹ค์ œ๋กœ๋Š” ์ œํ•œ๊ฐ’ 1์ดˆ๋กœ ๋‹ค๋ฃฌ๋‹ค.

์ปค๋„ 2.6.12์—์„œ๋Š” ์ปค๋„ ๋ฒ„๊ทธ ๋•Œ๋ฌธ์— RLIMIT_RTPRIO๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ปค๋„ 2.6.13์—์„œ ๋ฌธ์ œ๊ฐ€ ์ˆ˜์ •๋๋‹ค.

์ปค๋„ 2.6.12์—์„œ๋Š” getpriority(2)๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์šฐ์„ ์ˆœ์œ„ ๋ฒ”์œ„์™€ RLIMIT_NICE ๊ฐ„์— 1๋งŒํผ์˜ ๋ถˆ์ผ์น˜๊ฐ€ ์žˆ์—ˆ๋‹ค. ์ด ๋•Œ๋ฌธ์— ๋‚˜์ด์Šค ๊ฐ’ ์‹ค์ œ ์ƒํ•œ์„ 19 - rlim_cur๋กœ ๊ณ„์‚ฐํ–ˆ๋‹ค. ์ปค๋„ 2.6.13์—์„œ ์ˆ˜์ •๋๋‹ค.

๋ฆฌ๋ˆ…์Šค 2.6.12๋ถ€ํ„ฐ๋Š” ํ”„๋กœ์„ธ์Šค๊ฐ€ RLIMIT_CPU ์ œํ•œ์— ๋„๋‹ฌํ–ˆ๋Š”๋ฐ SIGXCPU์— ๋Œ€ํ•œ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ์„ค์น˜๋ผ ์žˆ๋Š” ๊ฒฝ์šฐ ์ปค๋„์—์„œ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ถ”๊ฐ€๋กœ ์—ฐ์„ฑ ์ œํ•œ์„ 1์ดˆ๋งŒํผ ์˜ฌ๋ฆฐ๋‹ค. ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ณ„์† CPU ์‹œ๊ฐ„์„ ์†Œ๋ชจํ•˜๋ฉด ์ด ๋™์ž‘์ด ๋˜ํ’€์ด๋˜๊ณ , ๊ทธ๋Ÿฌ๋‹ค ๊ฒฝ์„ฑ ์ œํ•œ์— ๋„๋‹ฌํ•˜๋ฉด ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ฃฝ๋Š”๋‹ค. ๋‹ค๋ฅธ ๊ตฌํ˜„๋“ค์—์„œ๋Š” ์ด๋Ÿฐ ์‹์œผ๋กœ RLIMIT_CPU ์—ฐ์„ฑ ์ œํ•œ์„ ๋ฐ”๊พธ์ง€ ์•Š์œผ๋ฉฐ ๋ฆฌ๋ˆ…์Šค์˜ ๋™์ž‘ ๋ฐฉ์‹์€ ํ‘œ์ค€์— ๋ถ€ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด์‹ ๊ฐ€๋Šฅํ•œ ์‘์šฉ์—์„œ๋Š” ๋ฆฌ๋ˆ…์Šค ํ•œ์ •์ธ ์ด ๋™์ž‘ ๋ฐฉ์‹์— ์˜์กดํ•˜๋Š” ๊ฑธ ํ”ผํ•ด์•ผ ํ•œ๋‹ค. ๋ฆฌ๋ˆ…์Šค ํ•œ์ •์ธ RLIMIT_RTTIME ์ œํ•œ ์—ญ์‹œ ์—ฐ์„ฑ ์ œํ•œ์„ ๋งŒ๋‚ฌ์„ ๋•Œ ๊ฐ™์€ ๋™์ž‘์„ ๋ณด์ธ๋‹ค.

์ปค๋„ 2.4.22 ์ „์—์„œ๋Š” setrlimit()์—์„œ rlim->rlim_cur๊ฐ€ rlim->rlim_max๋ณด๋‹ค ํด ๋•Œ EINVAL ์˜ค๋ฅ˜๋กœ ์ง„๋‹จํ•˜์ง€ ์•Š์•˜๋‹ค.

๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ ๋•Œ๋ฌธ์— RLIMIT_CPU ์„ค์ • ์‹œ๋„๊ฐ€ ์‹คํŒจํ–ˆ์„ ๋•Œ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š๋Š”๋‹ค.

32๋น„ํŠธ ํ”Œ๋žซํผ์—์„œ "ํฐ" ์ž์› ์ œํ•œ๊ฐ’ ํ‘œํ˜„ํ•˜๊ธฐ

glibc์˜ getrlimit() ๋ฐ setrlimit() ๋ž˜ํผ ํ•จ์ˆ˜๋Š” 32๋น„ํŠธ ํ”Œ๋žซํผ์—์„œ๋„ 64๋น„ํŠธ์งœ๋ฆฌ rlim_t ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์“ด๋‹ค. ํ•˜์ง€๋งŒ getrlimit() ๋ฐ setrlimit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์—์„œ ์“ฐ๋Š” rlim_t ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ (32๋น„ํŠธ์ธ) unsigned long์ด๋‹ค. ๋˜ํ•œ ๋ฆฌ๋ˆ…์Šค์˜ ์ปค๋„์—์„œ๋Š” 32๋น„ํŠธ ํ”Œ๋žซํผ์—์„œ unsigned long์œผ๋กœ ์ž์› ์ œํ•œ์„ ํ‘œํ˜„ํ•œ๋‹ค. ํ•˜์ง€๋งŒ 32๋น„ํŠธ ๋ฐ์ดํ„ฐ ํƒ€์ž…์€ ์ถฉ๋ถ„ํžˆ ํฌ์ง€ ์•Š๋‹ค. ํŠนํžˆ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๊ฐ€ ํŒŒ์ผ์ด ์ตœ๋Œ€๋กœ ์ปค์งˆ ์ˆ˜ ์žˆ๋Š” ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜๋Š” RLIMIT_FSIZE์ด๋‹ค. ์ด ์ œํ•œ์ด ์œ ์šฉํ•˜๋ ค๋ฉด ํŒŒ์ผ ์˜คํ”„์…‹์„ ๋‚˜ํƒ€๋‚ด๋Š” ๋ฐ ์“ฐ๋Š” ํƒ€์ž…๋งŒํผ์€ ํฐ ํƒ€์ž…์„ ์จ์„œ ์ œํ•œ์„ ํ‘œํ˜„ํ•ด์•ผ ํ•œ๋‹ค. ์ฆ‰ (ํ”„๋กœ๊ทธ๋žจ์ด _FILE_OFFSET_BITS=64๋กœ ์ปดํŒŒ์ผ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด) 64๋น„ํŠธ์ธ off_t๋งŒํผ์€ ์ปค์•ผ ํ•œ๋‹ค.

์ปค๋„์˜ ์ด๋Ÿฐ ํ•œ๊ณ„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ž์› ์ œํ•œ๊ฐ’์„ 32๋น„ํŠธ unsigned long์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅํ•œ ๊ฒƒ๋ณด๋‹ค ํฌ๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒฝ์šฐ glibc์˜ setrlimit() ๋ž˜ํผ ํ•จ์ˆ˜์—์„œ๋Š” ๊ทธ ์ œํ•œ๊ฐ’์„ ์กฐ์šฉํžˆ RLIM_INFINITY๋กœ ๋ฐ”๊ฟจ๋‹ค. ๋‹ฌ๋ฆฌ ๋งํ•ด ์š”์ฒญํ•œ ์ž์› ์ œํ•œ ์„ค์ •์ด ์กฐ์šฉํžˆ ๋ฌด์‹œ๋๋‹ค.

๋ฒ„์ „ 2.13๋ถ€ํ„ฐ glibc์—์„œ๋Š” getrlimit() ๋ฐ setrlimit() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์˜ ํ•œ๊ณ„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด prlimit()๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ž˜ํผ ํ•จ์ˆ˜ ํ˜•ํƒœ๋กœ setrlimit() ๋ฐ getrlimit()๋ฅผ ๊ตฌํ˜„ํ•œ๋‹ค.

EXAMPLE

์•„๋ž˜ ํ”„๋กœ๊ทธ๋žจ์€ prlimit() ์‚ฌ์šฉ ๋ฐฉ์‹์„ ๋ณด์—ฌ ์ค€๋‹ค.

#define _GNU_SOURCE
#define _FILE_OFFSET_BITS 64
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/resource.h>

#define errExit(msg) do { perror(msg); exit(EXIT_FAILURE); \
                        } while (0)

int
main(int argc, char *argv[])
{
    struct rlimit old, new;
    struct rlimit *newp;
    pid_t pid;

    if (!(argc == 2 || argc == 4)) {
        fprintf(stderr, "Usage: %s <pid> [<new-soft-limit> "
                "<new-hard-limit>]\n", argv[0]);
        exit(EXIT_FAILURE);
    }

    pid = atoi(argv[1]);        /* ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ PID */

    newp = NULL;
    if (argc == 4) {
        new.rlim_cur = atoi(argv[2]);
        new.rlim_max = atoi(argv[3]);
        newp = &new;
    }

    /* ๋Œ€์ƒ ํ”„๋กœ์„ธ์Šค์˜ CPU ์‹œ๊ฐ„ ์ œํ•œ ์„ค์ •.
       ์ด์ „ ์ œํ•œ๊ฐ’ ์–ป์–ด ์™€์„œ ํ‘œ์‹œ. */

    if (prlimit(pid, RLIMIT_CPU, newp, &old) == -1)
        errExit("prlimit-1");
    printf("Previous limits: soft=%lld; hard=%lld\n",
            (long long) old.rlim_cur, (long long) old.rlim_max);

    /* ์ƒˆ CPU ์‹œ๊ฐ„ ์ œํ•œ ์–ป์–ด ์™€์„œ ํ‘œ์‹œ. */

    if (prlimit(pid, RLIMIT_CPU, NULL, &old) == -1)
        errExit("prlimit-2");
    printf("New limits: soft=%lld; hard=%lld\n",
            (long long) old.rlim_cur, (long long) old.rlim_max);

    exit(EXIT_SUCCESS);
}

SEE ALSO

prlimit(1), dup(2), fcntl(2), fork(2), getrusage(2), mlock(2), mmap(2), open(2), quotactl(2), sbrk(2), shmctl(2), malloc(3), sigqueue(3), ulimit(3), core(5), capabilities(7), cgroups(7), credentials(7), signal(7)


2018-04-30

โš ๏ธ **GitHub.com Fallback** โš ๏ธ