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);
}
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