getrlimit(2) - wariua/manpages-ko GitHub Wiki
getrlimit, setrlimit, prlimit - ์์ ์ ํ ์ป๊ธฐ/์ค์ ํ๊ธฐ
#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
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()
์์คํ
ํธ์ถ์ 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์ ์ผ์นํด์ผ ํ๋ค.
์ฑ๊ณต ์ ์ด ์์คํ
ํธ์ถ๋ค์ 0์ ๋ฐํํ๋ค. ์ค๋ฅ ์ -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.
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์ ํ๋ก์ธ์ค๋ฅผ ์ฐพ์ ์ ์๋ค.
๋ฆฌ๋
์ค 2.6.36๋ถํฐ prlimit()
์์คํ
ํธ์ถ์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค. glibc 2.13๋ถํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ง์์ด ์ ๊ณต๋๋ค.
์ด ์ ์์ ์ฌ์ฉํ๋ ์ฉ์ด๋ค์ ๋ํ ์ค๋ช ์ attributes(7)๋ฅผ ๋ณด๋ผ.
์ธํฐํ์ด์ค | ์์ฑ | ๊ฐ |
---|---|---|
getrlimit() , setrlimit() , prlimit()
|
์ค๋ ๋ ์์ ์ฑ | MT-Safe |
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
์ ๋ฆฌ๋
์ค ์ ์ฉ์ด๋ค.
fork(2)๋ฅผ ํตํด ์์ฑ๋ ์์ ํ๋ก์ธ์ค๋ ๋ถ๋ชจ์ ์์ ์ ํ๋ค์ ๋ฌผ๋ ค๋ฐ๋๋ค. execve(2)๋ฅผ ๊ฑฐ์น๋ฉด์ ์์ ์ ํ๋ค์ด ๋ณด์กด๋๋ค.
์์ ์ ํ์ ํ๋ก์ธ์ค๋ณ ์์ฑ์ด๋ฏ๋ก ํ๋ก์ธ์ค ๋ด ๋ชจ๋ ์ค๋ ๋๊ฐ ๊ณต์ ํ๋ค.
์์์ ์ฐ์ฑ ์ ํ์ ํ๋ก์ธ์ค๊ฐ ํ์ฌ ๊ทธ ์์์ ์ฐ๊ณ ์๋ ๊ฒ๋ณด๋ค ๋ฎ๊ฒ ๋ด๋ ค๋ ์ฑ๊ณตํ๋ค. (ํ์ง๋ง ํ๋ก์ธ์ค๊ฐ ๊ทธ ์์ ์ฌ์ฉ๋์ ๋ ๋์ด์ง ๋ชปํ๊ฒ ๋๋ค.)
์
ธ์ ๋ด์ฅ ๋ช
๋ น ulimit
(csh(1)
์์๋ limit
)์ ์ฌ์ฉํด ์
ธ์ ์์ ์ ํ์ ์ค์ ํ ์ ์๋ค. ์
ธ์์ ๋ช
๋ น ์คํ์ ์ํด ์์ฑํ๋ ํ๋ก์ธ์ค๋ค์ด ๊ทธ ์์ ์ ํ์ ๋ฌผ๋ ค๋ฐ๋๋ค.
๋ฆฌ๋
์ค 2.6.24๋ถํฐ /proc/[pid]/limits
๋ฅผ ํตํด ๋ชจ๋ ํ๋ก์ธ์ค์ ์์ ์ ํ๊ฐ์ ๋ค์ฌ๋ค๋ณผ ์ ์๋ค. proc(5) ์ฐธ๊ณ .
์์ฃผ ์๋ ์์คํ
์์ setrlimit()
๊ณผ ์ฉ๋๊ฐ ๋น์ทํ vlimit()
ํจ์๋ฅผ ์ ๊ณตํ๋ค. ํ์ ํธํ์ฑ์ ์ํด glibc์์๋ vlimit()
๋ฅผ ์ ๊ณตํ๋ค. ์๋ก ์์ฑํ๋ ์์ฉ์ ๋ชจ๋ setrlimit()
์ ์ฐ๋๋ก ์์ฑํด์ผ ํ๋ค.
๋ฒ์ 2.12๋ถํฐ glibc์ getrlimit()
๋ฐ setrlimit()
๋ํผ ํจ์์์๋ ๋ ์ด์ ๋์ํ๋ ์์คํ
ํธ์ถ์ ๋ถ๋ฅด์ง ์๊ณ ๋์ prlimit()
์ ์ด์ฉํ๋ค. ์ด๋ BUGS์์ ์ค๋ช
ํ๋ ์ด์ ๋ค ๋๋ฌธ์ด๋ค.
glibc ๋ํผ ํจ์์ ์ด๋ฆ์ด prlimit()
์ด๋ค. ๊ธฐ๋ฐ ์์คํ
ํธ์ถ์ prlimit64()
์ด๋ค.
๊ตฌ์ ๋ฆฌ๋
์ค ์ปค๋๋ค์์๋ ํ๋ก์ธ์ค๊ฐ ์ฐ์ฑ ๋ฐ ๊ฒฝ์ฑ 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
์ค์ ์๋๊ฐ ์คํจํ์ ๋ ์ค๋ฅ๋ฅผ ๋ฐํํ์ง ์๋๋ค.
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()
๋ฅผ ๊ตฌํํ๋ค.
์๋ ํ๋ก๊ทธ๋จ์ 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);
}
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