파일 서술자 복제 함수 dup, dup2
- 파일 서술자(file descriptor)를 복사함
- 헤더는 unistd.h
dup
→ dup는 fd로 전달받은 파일 서술자를 복제하여 반환. dup가 돌려주는 파일 서술자는 가장 낮은 서술자를 반환.
- 성공시 새 파일 서술자
- 오류시 -1 반환
#include <unistd.h>
int dup(int fd);
예제
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int old_fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
printf("Old file descriptor: %d\\n", old_fd);
// dup() 함수를 사용하여 새로운 파일 디스크립터 생성
int new_fd = dup(old_fd);
printf("New file descriptor (dup): %d\\n", new_fd);
// 파일에 데이터를 쓰기
char data[] = "Hello, World!";
write(new_fd, data, sizeof(data) - 1);
close(old_fd);
close(new_fd);
return 0;
}
- open() 함수를 사용하여 "file.txt" 파일을 쓰기 전용으로 연다. 없으면 만든다.
- dup() 함수를 사용해서 old_fd라는 파일 디스크립터를 복제하여 new_fd를 생성
- new_fd를 사용해서 파일에 데이터를 쓸 수 있음.
코드 부가적인 설명
file.txt을 열고 그 파일 디스크립터가 old_fd에 할당 됨.
old_fd를 복제하여 나온 파일 디스크립터를 new_fd가 가지고 있게 함.
write를 통해 hello world 쓰기 → new_fd에 쓰기
결과
dup2
→ 새 서술자의 값을 fd2로 지정함. 만일 fd2가 이미 열려있으면 fd2를 닫은 후 복제가 됨.
- 성공시 새 파일 서술자
- 오류시 -1 반환
#include <unistd.h>
int dup2(int fd, int fd2);
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
int main() {
int old_fd = open("file.txt", O_WRONLY | O_CREAT | O_TRUNC, 0644);
printf("Old file descriptor: %d\\n", old_fd);
// dup2() 함수를 사용하여 표준 출력을 파일 디스크립터로 변경
//첫 번째 그림
int stdout_fd = dup(STDOUT_FILENO);
//두 번째 그림
dup2(old_fd, STDOUT_FILENO);
printf("This will be written to the file.\\n");
// 표준 출력을 원래의 파일 디스크립터로 복구
// 세 번째 그림
dup2(stdout_fd, STDOUT_FILENO);
printf("This will be displayed on the terminal.\\n");
close(old_fd);
close(stdout_fd);
return 0;
}
- dup(STDOUT_FILENO)
- STDOUT 복제
- STDOUT을 복제하여 stdout_fd에 넣어줌
- dup2(old_fd, STDOUT_FILENO)
- 이 친구를 설명할 때 fd2가 fd를 가리킨다라고 생각!!
STDOUT_FILENO → old_fd
2. 윗 부분을 다시 서술하면
→ STDOUT_FILENO를 가리키는 fd 1번 친구가 old_fd를 가리키게 하여 old_fd가 가리키는 친구가 출력 스트림으로 만 든다.
dup2로 STDOUT_FILENO라는 파일 서술자를 명시된 old_fd로 바꿈. dup2는 성공적으로 호출이 되면 두 번째 인자의 값을 반환합니다. 실패시 -1을 반환
좀 더 쉬운 그림 설명
- STDOUT이 old_fd를 가리킨다고 생각하면 됨. 즉, fd2→fd1를 가리킨다고 생각하면 됨.
그러면 구조가 file.txt < old_fd < STDOUT_FILENO
또 다른 방법
- old_fd가 가리키고 있는 file.txt를 fd값이 1번인 친구가 file.txt를 가리킨다.
- dup2(stdout_fd, STDOUT_FILENO);
- stdout_fd → 다시 STDOUT을 가리키게 함.
또 다른 그림
[리눅스] dup, dup2 설명 및 쉬운 사용법, 사용 예제(그림 포함)
[리눅스] dup, dup2 설명 및 쉬운 사용법, 사용 예제(그림 포함)
dup, dup2 이외에도 파일을 다루는 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요. https://reakwon.tistory.com/233 리눅스 프로그래밍 note 배포
reakwon.tistory.com
Linux : dup과 dup2
/* * http://sosal.tistory.com/ * made by so_Sal */ 이 포스팅은 open, read, write 등의 시스템콜을 기본적으로 안다는 가정 하에 작성된 글입니다. 위 시스템콜에 대해서 모르신다면 :: LINK_ 1. dup 2. dup2 1.dup - 파
sosal.kr
'42Seoul > pipex' 카테고리의 다른 글
pipe(), unlink() (0) | 2023.09.13 |
---|---|
access() (0) | 2023.09.13 |
execve() (0) | 2023.09.13 |
리다이렉션 <, >, <<, >> (0) | 2023.09.13 |
프로세스 통신(IPC) (0) | 2023.09.13 |