C의 dup2 함수

Jinku Hu 2023년10월12일
  1. dup2 함수를 사용하여 C에서 파일 설명자를 복제합니다
  2. dup 함수를 사용하여 C에서 파일 설명자를 복제합니다
C의 dup2 함수

이 기사에서는 C에서dup2 함수를 사용하는 방법에 대한 몇 가지 방법을 설명합니다.

dup2 함수를 사용하여 C에서 파일 설명자를 복제합니다

파일은 일반적으로open 시스템 호출을 사용하여 열린 후에 조작됩니다. 성공하면open은 새로 열린 파일과 관련된 새 파일 설명자를 반환합니다. Unix 기반 시스템에서 운영 체제는 실행중인 각 프로그램에 대해 파일 테이블이라고하는 열린 파일 목록을 유지합니다. 각 항목은int 유형 정수를 사용하여 표시됩니다. 이러한 정수를 이러한 시스템에서 파일 설명 자라고하며 많은 시스템 호출이 파일 설명자 값을 매개 변수로 사용합니다.

실행중인 모든 프로그램에는 명시 적으로 닫기를 선택하지 않는 한 프로세스가 생성 될 때 기본적으로 세 개의 열린 파일 설명자가 있습니다. dup2 함수는 주어진 파일 설명 자의 복사본을 만들고 여기에 새로운 정수를 할당합니다. dup2는 복제 될 이전 파일 설명자를 첫 번째 매개 변수로 취하고 두 번째 매개 변수는 새 파일 설명 자의 정수입니다. 결과적으로이 두 파일 설명자는 동일한 파일을 가리키며 서로 바꿔서 사용할 수 있습니다. 사용자가 열린 파일에서 현재 사용하는 정수를 두 번째 매개 변수로 지정하면 해당 정수가 닫히고 복제 된 파일 설명 자로 재사용됩니다.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern int counter;

int main(void) {
  int fd = open("tmp.txt", O_WRONLY | O_APPEND);

  printf("tmp.txt fd = %d\n", fd);
  dup2(fd, 121);
  dprintf(121, "This string will be printed in tmp.txt file\n");

  exit(EXIT_SUCCESS);
}

출력:

tmp.txt fd = 3

위의 예는dup2 함수의 기본 사용법을 보여줍니다. 여기서tmp.txt라는 임의의 파일이append 모드로 열리고 일부 형식화 된 텍스트가 여기에 기록됩니다. 기본 파일 설명자는open 시스템 호출에서 반환 된3입니다. 121의 두 번째 인수로 dup2함수 호출을 실행 한 후 새 파일 설명자를 사용하여 동일한 파일에 주소를 지정할 수 있습니다. 결과적으로, 우리는 출력을 쓰기위한 목적지를 지정하는 추가 파일 설명자 인자를 취하는 것을 제외하고는printf 함수와 유사한dprintf 함수를 호출합니다.

dup 함수를 사용하여 C에서 파일 설명자를 복제합니다

또는dup이라는 또 다른 함수는dup2와 유사한 파일 디스크립터 복제를 수행합니다. 그러나dup 함수는 복사 할 파일 설명 자의 단일 인수를 취하고 새로 생성 된 것을 자동으로 반환합니다. 다음 예제는dup 사용법을 보여줍니다. 여기서 반환 된 값을int 유형으로 저장 한 다음dprintf 함수를 검색된 파일 설명자에 전달합니다. 사용자는 성공적인 실행을 확인하기 위해 두 함수 모두에 대한 오류 검사 루틴을 구현해야합니다. 자세한 내용은dup /dup2 매뉴얼 페이지 여기를 참조하세요.

#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

extern int counter;

int main(void) {
  int fd = open("tmp2.txt", O_WRONLY | O_APPEND);

  printf("tmp2.txt fd = %d\n", fd);
  int dup_fd = dup(fd);
  dprintf(dup_fd, "This string will be printed in tmp2.txt file\n");

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C File