dup(시스템 호출)
dup (system call)이 글은 검증을 위해 인용구가 추가로 필요하다. 호출 – · · 책 · (2012년 3월) (이 템플릿 |
Unix와 유사한 운영 체제에서 dup("중복제"의 줄임말)과 dup2 시스템 호출은 지정된 파일 설명자의 복사본을 만든다. 이 새로운 설명자는 사실 복사처럼 행동하는 것이 아니라, 옛 설명자의 가명처럼 행동한다.
C 라이브러리 POSIX 정의
dup과 dup2 통화는 POSIX 규격에 의해 표준화된다.[1]
인트로 속이다 (인트로 올드프드); 인트로 dup2 (인트로 올드프드, 인트로 뉴프드);
전자는 열려 있는() 동작과 마찬가지로 사용 가능한 첫 번째 설명자를 할당한다. 파일 설명자를 지정되지 않은 위치에 복제하는 다른 방법은 다음과 같은 fcntl 시스템 호출이다. F_DUPFD
명령하다
후자는 복사본을 새로운 fd에 넣는다. newfd가 열려 있으면 먼저 문을 닫는다.
입출력 리디렉션을 위한 dup2
유닉스 셸은 입출력 리디렉션에 dup2를 사용한다. 이와 함께 유닉스 파이프가 의존하는 툴이다.
다음 예에서는 다음을 사용한다. pipe()
그리고 dup()
Unix 파이프를 사용하여 두 개의 개별 프로세스(프로그램1 및 프로그램2)를 연결하려면:
#include <stdio.h> #include <stdlib.h> #include <유니스트드>.h> /* 기능 프로토타입 */ 공허하게 하다 죽다(경시하다 마를 뜨다*); 인트로 본래의(인트로 argc, 마를 뜨다 **아그브) { 인트로 pdes[2]; pid_t 어린아이의; 만일(파이프를 치다(pdes) == -1) 죽다("파이프()"); 어린아이의 = 포크를 갈다(); 만일(어린아이의 == (pid_t)(-1)) 죽다("fork()"); /* 포크 고장 */ 만일(어린아이의 == (pid_t)0) { /* 하위 프로세스 */ 가까운.(1); /* stdout 닫기 */ 만일(속이다(pdes[1]) == -1) 죽다("dup()"); /* 이제 stdout과 pdes[1]가 동일하다(최저 자유 설명자 중복 반환) */ 만일((퇴장시키다("프로그램1", "프로그램1", "arg1", NULL)) == -1) 죽다("execlp()"); _beakes(EXIT_SUPTION); } 다른 { /* 상위 프로세스 */ 가까운.(0); /* 닫힌 스틴 */ 만일(속이다(pdes[0]) == -1) 죽다("dup()"); /* 이제 stdin과 pdes[0]는 동일하다(최저 자유 설명자 중복 반환) */ 만일((퇴장시키다("프로그램2", "프로그램2", "arg1", NULL)) == -1) 죽다("execlp()"); 퇴장하다(EXIT_SUPTION); } 돌아오다 0; } 공허하게 하다 죽다(경시하다 마를 뜨다 *음스그) { 착오를 일으키다(음스그); 퇴장하다(EXIT_Failure); }
참고 항목
- 파일 설명자 – 파일 설명자의 작동 방식 및 열기 관련 기타 기능
참조
- ^ "dup, dup2". opengroup.org.
- W. Richard Stevens ISBN 81-7808-096-6의 UNIX 환경 고급 프로그래밍