dup2
및 의 사용을 이해하려고합니다 dup
.
man 페이지에서 :
DESCRIPTION
dup and dup2 create a copy of the file descriptor oldfd.
After successful return of dup or dup2, the old and new descriptors may
be used interchangeably. They share locks, file position pointers and
flags; for example, if the file position is modified by using lseek on
one of the descriptors, the position is also changed for the other.
The two descriptors do not share the close-on-exec flag, however.
dup uses the lowest-numbered unused descriptor for the new descriptor.
dup2 makes newfd be the copy of oldfd, closing newfd first if necessary.
RETURN VALUE
dup and dup2 return the new descriptor, or -1 if an error occurred
(in which case, errno is set appropriately).
시스템 호출이 필요한 이유는 무엇입니까? 파일 설명자를 복제하는 용도는 무엇입니까?
파일 설명자가있는 경우 복사본을 만드는 이유는 무엇입니까?
dup2
/ dup
가 필요한 곳을 설명하고 예를 들어 주시면 감사하겠습니다 .
감사
답변
dup 시스템 호출은 기존 파일 설명자를 복제하여 동일한 기본 I / O 개체를 참조하는 새 설명자를 반환합니다.
Dup을 사용하면 쉘이 다음과 같은 명령을 구현할 수 있습니다.
ls existing-file non-existing-file > tmp1 2>&1
2> & 1은 디스크립터 1의 중복 인 파일 디스크립터 2를 명령에 제공하도록 쉘에 지시합니다 (즉, stderr & stdout가 동일한 fd를 가리킴).
이제 존재하지 않는 파일 에서 ls 를 호출하는 오류 메시지 와 ls 의 올바른 출력 에 파일 기존 에 쇼를 tmp1의 파일을.
다음 예제 코드는 파이프의 읽기 끝에 연결된 표준 입력으로 wc 프로그램을 실행합니다.
int p[2];
char *argv[2];
argv[0] = "wc";
argv[1] = 0;
pipe(p);
if(fork() == 0) {
close(STDIN); //CHILD CLOSING stdin
dup(p[STDIN]); // copies the fd of read end of pipe into its fd i.e 0 (STDIN)
close(p[STDIN]);
close(p[STDOUT]);
exec("/bin/wc", argv);
} else {
write(p[STDOUT], "hello world\n", 12);
close(p[STDIN]);
close(p[STDOUT]);
}
자식은 읽기 끝을 파일 설명자 0에 복제하고, p의 파일 디스크립터를 닫고, wc를 실행합니다. wc가 표준 입력에서 읽을 때 파이프에서 읽습니다.
이것이 dup을 사용하여 파이프를 구현하는 방법입니다. 이제 dup을 사용하여 파이프를 사용하여 다른 것을 빌드합니다. 시스템 호출의 아름다움입니다. 이미있는 도구를 사용하여 하나씩 차례로 빌드합니다.이 도구는 다음을 사용하여 빌드되었습니다. 다른 것 등등 .. 마지막에 시스템 호출은 커널에서 얻을 수있는 가장 기본적인 도구입니다.
건배 🙂
답변
파일 설명자를 복제하는 또 다른 이유는 fdopen
. fclose
에 전달 된 파일 설명자를 닫습니다. fdopen
따라서 원래 파일 설명자가 닫히지 않도록하려면 dup
먼저 복제해야합니다 .
답변
dup은 프로세스에서 출력을 리디렉션하는 데 사용됩니다.
예를 들어, 프로세스의 출력을 저장하려면 출력을 복제 (fd = 1)하고 복제 된 fd를 파일로 리디렉션 한 다음 프로세스를 분기하여 실행하고 프로세스가 완료되면 다시 리디렉션합니다. fd를 출력에 저장했습니다.
답변
dup / dup2와 관련된 몇 가지 사항을 알려주십시오.
dup / dup2-기술적으로 목적은 다른 핸들 로 단일 프로세스 내에서 하나의 파일 테이블 항목을 공유하는 것입니다 . (포킹하는 경우 디스크립터는 기본적으로 자식 프로세스에서 복제되며 파일 테이블 항목도 공유됩니다).
즉, 다른 속성을 가진 둘 이상의 파일 설명자를 가질 수 있습니다. dup / dup2 함수를 사용하여 하나의 열린 파일 테이블 항목에 대해 을 있습니다.
(현재 FD_CLOEXEC 플래그 만 파일 설명자에 대한 유일한 속성 인 것처럼 보이지만).
http://www.gnu.org/software/libc/manual/html_node/Descriptor-Flags.html
dup(fd) is equivalent to fcntl(fd, F_DUPFD, 0);
dup2(fildes, fildes2); is equivalent to
close(fildes2);
fcntl(fildes, F_DUPFD, fildes2);
차이점은 (마지막)-일부 errno 값을 제외하고는 dup2 및 fcntl close 다음에 fcntl이 두 개의 함수 호출이 관련되어 있기 때문에 경쟁 조건을 일으킬 수 있습니다.
자세한 내용은 http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html 에서 확인할 수 있습니다
.
사용 예 –
아래 링크에서 dup / dup2의 사용을 볼 수있는 쉘에서 작업 제어를 구현하는 동안 흥미로운 예가 하나 있습니다.
http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs
답변
