42Seoul/pipex

dup, dup2

재윤 2023. 9. 13. 01:32
반응형

파일 서술자 복제 함수 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)
  1. 이 친구를 설명할 때 fd2가 fd를 가리킨다라고 생각!!

STDOUT_FILENO → old_fd

   2. 윗 부분을 다시 서술하면

    → STDOUT_FILENO를 가리키는 fd 1번 친구가 old_fd를 가리키게 하여 old_fd가 가리키는 친구가 출력 스트림으로 만           든다.

 

dup2로 STDOUT_FILENO라는 파일 서술자를 명시된 old_fd로 바꿈. dup2는 성공적으로 호출이 되면 두 번째 인자의 값을 반환합니다. 실패시 -1을 반환

 

좀 더 쉬운 그림 설명

  1. STDOUT이 old_fd를 가리킨다고 생각하면 됨. 즉, fd2→fd1를 가리킨다고 생각하면 됨.

그러면 구조가 file.txt < old_fd < STDOUT_FILENO

 

또 다른 방법

  1. old_fd가 가리키고 있는 file.txt를 fd값이 1번인 친구가 file.txt를 가리킨다.

 

  • dup2(stdout_fd, STDOUT_FILENO);
  1. stdout_fd → 다시 STDOUT을 가리키게 함.

 

또 다른 그림

[리눅스] dup, dup2 설명 및 쉬운 사용법, 사용 예제(그림 포함)

 

[리눅스] dup, dup2 설명 및 쉬운 사용법, 사용 예제(그림 포함)

dup, dup2 이외에도 파일을 다루는 더 많은 정보와 예제를 담은 리눅스 교재를 배포했습니다. 아래의 페이지에서 리눅스 교재를 받아가세요. https://reakwon.tistory.com/233 리눅스 프로그래밍 note 배포

reakwon.tistory.com

Linux : dup과 dup2

 

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