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 을 쓰기 위해
이것저것 해보다가 저 방법이 가장 좋은 듯 해서 여기에 적어둔다.
[출처] Dup2 를 이용한 Redirection 과 원상복귀|작성자 만싹
'컴퓨터 > 언어,프로그래밍' 카테고리의 다른 글
운영체제(유닉스)에서 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 |