dup - whdlgp/system_programming_pra GitHub Wiki
์ด์ ์ ์ธ๊ธํ ํ๋๋งํฌ์ ๋น์ทํ๋ค๋ฉด ๋น์ทํ ๋๋์ด๋ค. ํ์ผ ๋์คํฌ๋ฆฝํฐ fd1์ ๋ง๋ค๊ณ , fd1์ ํ์ผ1์ ๊ฐ๋ฆฌํจ๋ค๊ณ ํ์. ๊ทธ๋ฐ๋ fd2 ๋ ํ์ผ1์ ๊ฐ๋ฆฌํค๊ฒ ํ๊ณ ์ถ๋ค๋ฉด? ๋ญ ์ด๋ฐ ๊ฒ๋ค์ ํ๊ณ ์ถ๋ค๋ ์๋ฆฌ๋ค.
์ฝ๊ฒ ๋งํด ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ฅผ ๋ณต์ฌํ๊ฒ ๋ค๋ ์๋ฆฌ
dup(์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ)
๋ฆฌํด๊ฐ์ '์๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ'์ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ๋ฆฌํค๋ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค.
dup2(ํ์ผ ๋์คํฌ๋ฆฝํฐ1, ํ์ผ ๋์คํฌ๋ฆฝํฐ2)
'ํ์ผ ๋์คํฌ๋ฆฝํฐ1' ์ด ๊ฐ๋ฆฌํค๋ ์ ๋ณด๋ฅผ, ํ์ผ ๋์คํฌ๋ฆฝํฐ2๋ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค.
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
int main(int argc, char* argv[])
{
int fd1, fd2, fd3;
char c1, c2, c3;
char *fname = argv[1];
fd1 = open(fname, O_RDONLY);
fd2 = open(fname, O_RDONLY);
fd3 = open(fname, O_RDONLY);
dup2(fd2, fd3);
read(fd1, &c1, 1);
read(fd2, &c2, 1);
read(fd3, &c3, 1);
printf("c1 = %c, c2 = %c, c3 = %c", c1, c2, c3);
return 0;
}
./dup2 data.txt
c1 = a, c2 = a, c3 = b%
data.txt์๋ "abcde" ๋ผ๋ ์ ๋ณด๊ฐ ์ ์ฅ๋์ด์๋ค.
fd2์ fd3์ ๊ฐ์ ์ ๋ณด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋๋ค. ์ฝ๊ฒ๋งํด fd2์ fd3๋ ์ฌ์ค์ ๊ฐ์ ํ์ผ ๋์คํฌ๋ฆฝํฐ๋ค.
- ์ฒซ๋ฒ์งธ read ์์ fd1 ๋ฅผ ์ฝ์ ๋, data.txt์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
- ๋๋ฒ์งธ read ์์ fd2 ๋ฅผ ์ฝ์ ๋, data.txt์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค.
- ์ธ๋ฒ์งธ read ์์ fd3 ๋ฅผ ์ฝ์ ๋, fd2๋ฅผ ์ฝ์๋ ์ฝ๊ธฐ/์ฐ๊ธฐ ์์น ํฌ์ธํฐ๊ฐ ์ด๋ํ์ผ๋ฏ๋ก ๋๋ฒ์งธ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค. ๊ทธ๋์ ์ถ๋ ฅ์ a, a, b ์์๋๋ก ์ถ๋ ฅ๋๋ค.
read(fd1, &c1, 1);
read(fd2, &c2, 1);
read(fd3, &c3, 1);
์ด ๊ตฌ๋ฌธ์
read(fd1, &c1, 1);
read(fd2, &c2, 1);
read(fd2, &c3, 1); //fd2 ๋ก ๋ณ๊ฒฝํด๋ด
์ ๊ฐ์ด ๋ฐ๊พผ ํ ์ถ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด dup2 ๊ฐ ์ด๋ค ์ญํ ์ ํ๋์ง ์ดํดํ ์ ์์ ๊ฒ์ด๋ค.