dup(2) - wariua/manpages-ko GitHub Wiki
dup, dup2, dup3 - ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ณต์ ํ๊ธฐ
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
#define _GNU_SOURCE /* feature_test_macros(7) ์ฐธ๊ณ */
#include <fcntl.h> /* O_* ์์ ์ ์ ์ป๊ธฐ */
#include <unistd.h>
int dup3(int oldfd, int newfd, int flags);
dup()
์์คํ
ํธ์ถ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ oldfd
์ ์ฌ๋ณธ์ ๋ง๋ ๋ค. ์ ์ฐ๋ ๊ฐ์ฅ ๋ฎ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ฅผ ์ ๋์คํฌ๋ฆฝํฐ์ ์ด๋ค.
์ฑ๊ณต ๋ฐํ ํ์๋ ์ด์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์๋ก ๋ฐ๊ฟ ๊ฐ๋ฉฐ ์ฌ์ฉํ ์๋ ์๋ค. ๊ฐ์ ์ด๋ฆฐ ํ์ผ ๊ธฐ์ ํญ๋ชฉ(open(2) ์ฐธ๊ณ )์ ๊ฐ๋ฆฌํค๊ธฐ ๋๋ฌธ์ ์คํ์ ๊ณผ ํ์ผ ์ํ๋ฅผ ๊ณต์ ํ๋ค. ์๋ฅผ ๋ค์ด ํ์ชฝ ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ lseek(2)์ผ๋ก ํ์ผ ์คํ์ ์ ๋ณ๊ฒฝํ๋ฉด ๋ค๋ฅธ ์ชฝ์์๋ ์คํ์ ์ด ๋ฐ๋๋ค.
๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ๋๊ทธ('exec์์ ๋ซ๊ธฐ' ํ๋๊ทธ)๋ ๊ณต์ ํ์ง ์๋๋ค. ๋ณต์ ๋์คํฌ๋ฆฝํฐ์์๋ 'exec์์ ๋ซ๊ธฐ'(FD_CLOEXEC
, fcntl(2) ์ฐธ๊ณ ) ํ๋๊ทธ๊ฐ ๊บผ์ ธ ์๋ค.
dup2()
์์คํ
ํธ์ถ์ dup()
๊ณผ ๊ฐ์ ์ผ์ ํ๋ ์ ์ฐ๋ ๊ฐ์ฅ ๋ฎ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ฅผ ์ฐ๋ ๊ฒ ์๋๋ผ newfd
์ ์ง์ ํ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ฅผ ์ด๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ newfd
๊ฐ ์ด๋ฏธ ์ด๋ ค ์์ผ๋ฉด ์กฐ์ฉํ ๋ซ๊ณ ์ ์ฌ์ฌ์ฉํ๋ค.
ํ์ผ ๋์คํฌ๋ฆฝํฐ newfd
๋ฅผ ๋ซ๊ณ ์ฌ์ฌ์ฉํ๋ ๋จ๊ณ๋ฅผ ์์์ ์ผ๋ก ์ํํ๋ค. ์ด ์ ์ด ์ค์ํ ๊ฑด close(2)์ dup()
์ ์ด์ฉํด ๋๋ฑํ ๊ธฐ๋ฅ์ฑ์ ๊ตฌํํ๋ ค ํ๋ฉด newfd
๊ฐ ๋ ๋จ๊ณ ์ฌ์ด์์ ์ฌ์ฌ์ฉ๋ ์๋ ์๋ ๊ฒฝ์ ์กฐ๊ฑด์ ์ง๋ฉดํ๊ฒ ๋๊ธฐ ๋๋ฌธ์ด๋ค. ๋ฉ์ธ ํ๋ก๊ทธ๋จ์ ์ค๋จ์ํจ ์๊ทธ๋ ํธ๋ค๋ฌ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํ๊ฑฐ๋ ๋ณ๋ ฌ ์ค๋ ๋์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํ์ฌ ๊ทธ๋ฐ ์ฌ์ฌ์ฉ์ด ์ผ์ด๋ ์ ์์ ๊ฒ์ด๋ค.
๋ค์ ์ฌํญ์ ์ฃผ์ํด์ผ ํ๋ค.
-
oldfd
๊ฐ ์ ํจํ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์๋ ๊ฒฝ์ฐ ํธ์ถ์ด ์คํจํ๋ฉฐnewfd
๋ ๋ซํ์ง ์๋๋ค. -
oldfd
๊ฐ ์ ํจํ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ด๊ณnewfd
๊ฐoldfd
์ ๊ฐ์ด ๊ฐ์ ๊ฒฝ์ฐdup2()
๋ ์๋ฌด๊ฒ๋ ํ์ง ์๊ณnewfd
๋ฅผ ๋ฐํํ๋ค.
dup3()
๋ ๋ค์ ์ฌํญ์ ์ ์ธํ๋ฉด dup2()
์ ๊ฐ๋ค.
-
ํธ์ถ์๊ฐ
flags
์O_CLOEXEC
๋ฅผ ์ง์ ํด์ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ 'exec์์ ๋ซ๊ธฐ' ํ๋๊ทธ๊ฐ ์ค์ ๋๊ฒ ํ ์ ์๋ค. ์ด๊ฒ ์ ์ฉํ ์ ์๋ ์ด์ ์ ๋ํด์ open(2)์ ํด๋น ํ๋๊ทธ ์ค๋ช ์ ๋ณด๋ผ. -
oldfd
๊ฐnewfd
์ ๊ฐ์ ๊ฒฝ์ฐ์dup3()
๋EINVAL
์ค๋ฅ๋ก ์คํจํ๋ค.
์ฑ๊ณต ์ ์ด ์์คํ
ํธ์ถ๋ค์ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ฐํํ๋ค. ์ค๋ฅ ์ -1์ ๋ฐํํ๋ฉฐ errno
๋ฅผ ์ ์ ํ ์ค์ ํ๋ค.
EBADF
-
oldfd
๊ฐ ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ๊ฐ ์๋๋ค. EBADF
-
newfd
๊ฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ์ฉ ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ค. (getrlimit(2)์RLIMIT_NOFILE
์ค๋ช ์ฐธ๊ณ .) EBUSY
- (๋ฆฌ๋
์ค ํ์ ) open(2)๊ณผ
dup()
์ ๊ฒฝ์ ์กฐ๊ฑด ์์dup2()
๋dup3()
์์ ๋ฐํํ ์ ์๋ค. EINTR
-
dup2()
๋dup3()
ํธ์ถ์ด ์๊ทธ๋์ ์ํด ์ค๋จ๋์๋ค. signal(7) ์ฐธ๊ณ . EINVAL
- (
dup3()
)flags
์ ์ ํจํ์ง ์์ ๊ฐ์ด ์๋ค. EINVAL
- (
dup3()
)oldfd
๊ฐnewfd
์ ๊ฐ๋ค. EMFILE
- ์ด๋ฆฐ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๊ฐ์์ ๋ํ ํ๋ก์ธ์ค๋ณ ์ ํ์ ๋๋ฌํ๋ค. (getrlimit(2)์
RLIMIT_NOFILE
์ค๋ช ์ฐธ๊ณ .)
๋ฆฌ๋
์ค 2.6.27์์ dup3()
๊ฐ ์ถ๊ฐ๋์๋ค. glibc ๋ฒ์ 2.9๋ถํฐ ์ง์์ด ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
dup()
, dup2()
: POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.
dup3()
๋ ๋ฆฌ๋
์ค ์ ์ฉ์ด๋ค.
newfd
๊ฐ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ๋ dup2()
๊ฐ ๋ฐํํ๋ ์ค๋ฅ๊ฐ fcntl(..., F_DUPFD, ...)
์ด ๋ฐํํ๋ ์ค๋ฅ์ ๋ค๋ฅด๋ค. ์ด๋ค ์์คํ
์์๋ dup2()
๊ฐ F_DUPFD
์ฒ๋ผ EINVAL
์ ๋ฐํํ๊ธฐ๋ ํ๋ค.
newfd
๊ฐ ์ด๋ ค ์์์ ๋ close(2) ์์ ์ ์ค๋ฅ๊ฐ ๋ณด๊ณ ๋๋๋ผ๋ ๊ทธ ์ ๋ณด๊ฐ ์ ์ค๋๋ค. ์ด ์ ์ด ์ ๊ฒฝ ์ฐ์ด๋ ๊ฒฝ์ฐ์ (ํ๋ก๊ทธ๋จ์ด ๋จ์ผ ์ค๋ ๋์ด๊ณ ์๊ทธ๋ ํธ๋ค๋ฌ์์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํ์ง ์๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ผ๋ฉด) dup2()
ํธ์ถ ์ ์ newfd
๋ฅผ ๋ซ๋ ๊ฒ์ ์์์ ์ค๋ช
ํ ๊ฒฝ์ ์กฐ๊ฑด ๋๋ฌธ์ ์ฌ๋ฐ๋ฅธ ํด๋ฒ์ด ์๋๋ค. ๋์ ๋ค์๊ณผ ๊ฐ์ ์์ ์ฝ๋๋ฅผ ์ธ ์ ์์ ๊ฒ์ด๋ค.
/* 'newfd'๋ฅผ ๋ณต์ ํด์ ์๋์์ close() ์ค๋ฅ ๊ฒ์ฌ์ ์ฌ์ฉ.
EBADF ์ค๋ฅ๋ 'newfd'๊ฐ ์ด๋ ค ์์ง ์๋ค๋ ๋ป. */
tmpfd = dup(newfd);
if (tmpfd == -1 && errno != EBADF) {
/* ์์ ์ธ์ dup() ์ค๋ฅ ์ฒ๋ฆฌ */
}
/* 'oldfd'๋ฅผ 'newfd'๋ก ์์์ ์ผ๋ก ๋ณต์ */
if (dup2(oldfd, newfd) == -1) {
/* dup2() ์ค๋ฅ ์ฒ๋ฆฌ */
}
/* ์ด์ 'newfd'๊ฐ ์๋ ๊ฐ๋ฆฌํค๋ ํ์ผ์ ๋ํด์
close() ์ค๋ฅ ๊ฒ์ฌ */
if (tmpfd != -1) {
if (close(tmpfd) == -1) {
/* close ์ค๋ฅ ์ฒ๋ฆฌ */
}
}
2017-09-15