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

NAME

dup, dup2, dup3 - ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ณต์ œํ•˜๊ธฐ

SYNOPSIS

#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);

DESCRIPTION

dup() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ oldfd์˜ ์‚ฌ๋ณธ์„ ๋งŒ๋“ ๋‹ค. ์•ˆ ์“ฐ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ์ƒˆ ๋””์Šคํฌ๋ฆฝํ„ฐ์— ์“ด๋‹ค.

์„ฑ๊ณต ๋ฐ˜ํ™˜ ํ›„์—๋Š” ์ด์ „ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์™€ ์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ์„œ๋กœ ๋ฐ”๊ฟ” ๊ฐ€๋ฉฐ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ฐ™์€ ์—ด๋ฆฐ ํŒŒ์ผ ๊ธฐ์ˆ  ํ•ญ๋ชฉ(open(2) ์ฐธ๊ณ )์„ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์˜คํ”„์…‹๊ณผ ํŒŒ์ผ ์ƒํƒœ๋ฅผ ๊ณต์œ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ•œ์ชฝ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ lseek(2)์œผ๋กœ ํŒŒ์ผ ์˜คํ”„์…‹์„ ๋ณ€๊ฒฝํ•˜๋ฉด ๋‹ค๋ฅธ ์ชฝ์—์„œ๋„ ์˜คํ”„์…‹์ด ๋ฐ”๋€๋‹ค.

๋‘ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ํ”Œ๋ž˜๊ทธ('exec์—์„œ ๋‹ซ๊ธฐ' ํ”Œ๋ž˜๊ทธ)๋Š” ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋ณต์ œ ๋””์Šคํฌ๋ฆฝํ„ฐ์—์„œ๋Š” 'exec์—์„œ ๋‹ซ๊ธฐ'(FD_CLOEXEC, fcntl(2) ์ฐธ๊ณ ) ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊บผ์ ธ ์žˆ๋‹ค.

dup2()

dup2() ์‹œ์Šคํ…œ ํ˜ธ์ถœ์€ dup()๊ณผ ๊ฐ™์€ ์ผ์„ ํ•˜๋˜ ์•ˆ ์“ฐ๋Š” ๊ฐ€์žฅ ๋‚ฎ์€ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ newfd์— ์ง€์ •ํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ ๋ฒˆํ˜ธ๋ฅผ ์“ด๋‹ค. ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ newfd๊ฐ€ ์ด๋ฏธ ์—ด๋ ค ์žˆ์œผ๋ฉด ์กฐ์šฉํžˆ ๋‹ซ๊ณ ์„œ ์žฌ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ newfd๋ฅผ ๋‹ซ๊ณ  ์žฌ์‚ฌ์šฉํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ์›์ž์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด ์ ์ด ์ค‘์š”ํ•œ ๊ฑด close(2)์™€ dup()์„ ์ด์šฉํ•ด ๋™๋“ฑํ•œ ๊ธฐ๋Šฅ์„ฑ์„ ๊ตฌํ˜„ํ•˜๋ ค ํ•˜๋ฉด newfd๊ฐ€ ๋‘ ๋‹จ๊ณ„ ์‚ฌ์ด์—์„œ ์žฌ์‚ฌ์šฉ๋  ์ˆ˜๋„ ์žˆ๋Š” ๊ฒฝ์Ÿ ์กฐ๊ฑด์— ์ง๋ฉดํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์„ ์ค‘๋‹จ์‹œํ‚จ ์‹œ๊ทธ๋„ ํ•ธ๋“ค๋Ÿฌ์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ• ๋‹นํ•˜๊ฑฐ๋‚˜ ๋ณ‘๋ ฌ ์Šค๋ ˆ๋“œ์—์„œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๋ฅผ ํ• ๋‹นํ•˜์—ฌ ๊ทธ๋Ÿฐ ์žฌ์‚ฌ์šฉ์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋‹ค์Œ ์‚ฌํ•ญ์— ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค.

  • oldfd๊ฐ€ ์œ ํšจํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ ํ˜ธ์ถœ์ด ์‹คํŒจํ•˜๋ฉฐ newfd๋Š” ๋‹ซํžˆ์ง€ ์•Š๋Š”๋‹ค.

  • oldfd๊ฐ€ ์œ ํšจํ•œ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์ด๊ณ  newfd๊ฐ€ oldfd์™€ ๊ฐ’์ด ๊ฐ™์€ ๊ฒฝ์šฐ dup2()๋Š” ์•„๋ฌด๊ฒƒ๋„ ํ•˜์ง€ ์•Š๊ณ  newfd๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

dup3()

dup3()๋Š” ๋‹ค์Œ ์‚ฌํ•ญ์„ ์ œ์™ธํ•˜๋ฉด dup2()์™€ ๊ฐ™๋‹ค.

  • ํ˜ธ์ถœ์ž๊ฐ€ flags์— O_CLOEXEC๋ฅผ ์ง€์ •ํ•ด์„œ ์ƒˆ ํŒŒ์ผ ๋””์Šคํฌ๋ฆฝํ„ฐ์— 'exec์—์„œ ๋‹ซ๊ธฐ' ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒŒ ์œ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ด์œ ์— ๋Œ€ํ•ด์„  open(2)์˜ ํ•ด๋‹น ํ”Œ๋ž˜๊ทธ ์„ค๋ช…์„ ๋ณด๋ผ.

  • oldfd๊ฐ€ newfd์™€ ๊ฐ™์€ ๊ฒฝ์šฐ์— dup3()๋Š” EINVAL ์˜ค๋ฅ˜๋กœ ์‹คํŒจํ•œ๋‹ค.

RETURN VALUE

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

ERRORS

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 ์„ค๋ช… ์ฐธ๊ณ .)

VERSIONS

๋ฆฌ๋ˆ…์Šค 2.6.27์—์„œ dup3()๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. glibc ๋ฒ„์ „ 2.9๋ถ€ํ„ฐ ์ง€์›์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

CONFORMING TO

dup(), dup2(): POSIX.1-2001, POSIX.1-2008, SVr4, 4.3BSD.

dup3()๋Š” ๋ฆฌ๋ˆ…์Šค ์ „์šฉ์ด๋‹ค.

NOTES

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 ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ */
    }
}

SEE ALSO

close(2), fcntl(2), open(2)


2017-09-15

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