본문 바로가기

컴퓨터/언어,프로그래밍

Dup2 를 이용한 Redirection 과 원상복귀

Redirection 이란 어떤 실행에 대한 결과나 입력을 파일에 저장하거나 파일에서 읽어오는 거로써

 

Unix 계열의 shell 에서

 

?>./a.out > b.txt

 

혹은 ?>cat < a.txt

 

이런 것을 말하는 것이다.

 

c에서 dup2 를 이용하면

 

Terminal 에 관한 input 과 output 을 쉽게 redirection 을 할 수 있다

 

원형은 int dup2(int oldfd, int newfd)

 

그 input 과 output 의 fd는  stdin = 0 , stdout  = 1 이다.

 

output 을 파일로 redirection 하기 위해선

 

int fd = open("a.txt", O_WRONLY | O_CREAT);

dup2(fd, 1);

close(fd);

 

printf("HI");

 

하면 끝이다..

 

그럼 그 프로세스가 터미널 창에 내뱉는 모든 output 은 file 로 저장되게 된다.

 

돌려보지는 않았지만 파일에 HI 가 써져 있겠지..

 

stdin 도 같은 방법으로 할 수 있고 저 기본을 이용해서 여러가지 작업을 할 수가 있겠다

 

다음에 발생할 수 있는 문제는

 

저 뒤에 다시 stdin, stdout 을 사용해야 하는 경우이다.

 

그런 경우를 위해 아래와 같은 코드를 생각했는데

 

더 좋은 뭔가를 아신다면 코멘트를 남겨 주시라..

 

int bk, fd;

 

fd = open("a.txt", O_WRONLY | O_CREAT);
fd = open("a.txt", "w");

bk = open("dummy", O_WRONLY | O_CREAT); //백업용 더미 생성
//bk = open("dummy", "w"); //백업용 더미 생성

close(bk); //위 두 줄의 작업은 bk 에 적당한 file descriptor 를 받아온다

               //이 상황에서는 4 정도가 올 듯 한데

              //이런 식으로 해야 앞으로 다른 파일 open 시 저 fd 를 쓰지 않게 된다.

dup2(1, bk); //stdout 을 bk 에 복사

dup2(fd, 1); // fd를 stdout 에 복사

close(fd); // fd 를 닫고

printf("HI"); //파일에 쓰인다.

dup2(bk, 1); //bk 를 stdout 에 복사

printf("BYE"); //터미널에 쓰인다.

remove("dummy"); //더미를 지운다.

 

사실 굳이 dummy 라는 파일을 만들 필요없고 아무 파일이나 열었다가 닫으면 되는데

 

안전을 위해 저렇게 했다..

 

dummy 파일을 안 만들고 NULL 을 open 할 경우는 나중에 세그폴이 뜨고

 

int bk = 50; 이런 식으로 하고 굳이 open 을 하지 않는 방법도 있으나

 

이럴 경우 만약 파일을 대략 50개 연다거나 할 경우 문제가 발생한다.

 

여튼 redirection 후에 다시 stdout 과 in 을 쓰기 위해

 

이것저것 해보다가 저 방법이 가장 좋은 듯 해서 여기에 적어둔다.


'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글

운영체제(유닉스)에서 open()과 read()함수의 소스코드  (0) 2009.05.27
dup( ), dup2( )  (0) 2009.05.27
Socket inheritance with fork/dup2/exec  (0) 2009.05.27
간단한 pipe()에 대한 소스  (0) 2009.05.27
dup2()  (0) 2009.05.27
제주삼다수, 2L,... 오뚜기 진라면 매운... 상하목장 유기농 흰... 남양 프렌치카페 카... 고려인삼유통 홍삼 ... 종근당건강 오메가3... 요이치 카링 유무선...