dup2(2)
synopsis
#include <unistd.h>
int dup(int oldfd);
int dup2(int oldfd, int newfd);
#define _GNU_SOURCE /* See feature_test_macros(7) */
#include <fcntl.h> /* Definition of O_* constants */
#include <unistd.h>
int dup3(int oldfd, int newfd, int flags);
gptbox summary
dup() ์์คํ ํธ์ถ์ oldfd ๋์คํฌ๋ฆฝํฐ์ ๋์ผํ ์ด๋ฆฐ ํ์ผ ์ค๋ช ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์๋ก์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ํ ๋นํฉ๋๋ค. ์๋ก์ด ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ ํธ์ถ ํ๋ก์ธ์ค์์ ์ฌ์ฉ๋์ง ์์ ๊ฐ์ฅ ๋ฎ์ ๋ฒํธ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์์ ๋ณด์ฅํฉ๋๋ค. ์ฑ๊ณต์ ์ธ ๋ฐํ ํ์๋ ์ด์ ๋ฐ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ์๋ก ๊ตํํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ๋์ผํ ์ด๋ฆฐ ํ์ผ ์ค๋ช ์๋ฅผ ์ฐธ์กฐํ๋ฏ๋ก ํ์ผ ์คํ์ ๊ณผ ํ์ผ ์ํ ํ๋๊ทธ๋ฅผ ๊ณต์ ํฉ๋๋ค. ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ํ๋๊ทธ(FD_CLOEXEC)๋ฅผ ๊ณต์ ํ์ง ์์ผ๋ฉฐ dup()๋ฅผ ํตํด ์์ฑ๋ ๋ณต์ ๋์คํฌ๋ฆฝํฐ์ close-on-exec ํ๋๊ทธ๋ ๊บผ์ ธ ์์ต๋๋ค.
dup2() ์์คํ ํธ์ถ์ dup()์ ๋์ผํ ์์ ์ ์ํํ์ง๋ง ์ฌ์ฉ๋์ง ์์ ๊ฐ์ฅ ๋ฎ์ ๋ฒํธ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋์ newfd๋ก ์ง์ ๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ ๋ฒํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ค์ ๋งํด, ํ์ผ ๋์คํฌ๋ฆฝํฐ newfd๋ ์ด์ oldfd์ ๋์ผํ ์ด๋ฆฐ ํ์ผ ์ค๋ช ์๋ฅผ ๊ฐ๋ฆฌํค๋๋ก ์กฐ์ ๋ฉ๋๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ newfd๊ฐ ์ด์ ์ ์ด๋ ค ์์๋ค๋ฉด ์ฌ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ซํ๋๋ค. ๋ซ๊ธฐ๋ ๋ฌด์์์ผ๋ก ์ํ๋๋ฉฐ(์ฆ, dup2()์์ ์ค๋ฅ๊ฐ ๋ฐ์ํด๋ ๋ณด๊ณ ๋์ง ์์), ํ์ผ ๋์คํฌ๋ฆฝํฐ newfd๋ฅผ ๋ซ๊ณ ์ฌ์ฌ์ฉํ๋ ๋จ๊ณ๋ ์์์ ์ผ๋ก ์ํ๋ฉ๋๋ค.
dup3()์ dup2()์ ๋์ผํ์ง๋ง ๋ค์๊ณผ ๊ฐ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค:
- ํธ์ถ์๋ ํ๋๊ทธ๋ก O_CLOEXEC์ ์ง์ ํ์ฌ ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ์ ๋ํ close-on-exec ํ๋๊ทธ๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
- oldfd๊ฐ newfd์ ๊ฐ์ผ๋ฉด dup3()๋ EINVAL ์ค๋ฅ์ ํจ๊ป ์คํจํฉ๋๋ค.