실제 예에서는 dup 또는 dup2를 사용합니다.
어떻게 하는지는 알지만 언제 사용할지는 모릅니다.
실용적인 예가 있나요?
고마워요.
I/O 리다이렉션을 예로 들 수 있습니다.이를 위해 자녀 프로세스를 포크하고 stdin 또는 stdout 파일 기술자(0 및 1)를 닫은 다음 선택한 다른 파일 기술자(이 경우 0 또는 1)에서 dup()을 수행합니다.
이를 사용하여 응용 프로그램을 인식하지 못할 수 있는 모든 하위 프로세스를 실행할 수 있으며, 자녀가 stdout에 쓰기(또는 stdin에서 읽기)할 때마다 대신 제공된 파일 설명자에 데이터가 기록됩니다.
은 이를 를 들어 다음과 같습니다./bin/ls | more
stdout stdin stdin stdin stdin stdin stdin stdown stdout stdout stdown stdin stdin stdin stdin stda stdown stdown stdout stda std.
하는 가장 dupp dup2입니다.
첫 번째로 알아야 할 것은 시스템에 입력과 출력을 처리하는 3개의 기본 파일 ID(또는 출력 또는 입력 소스를 나타내는 변수)가 있다는 것입니다.그들은 그렇다.stdin
,stdout
,stderr
에서는 '''가 0
,1
,2
입니다.fprintf
★★★★★★★★★★★★★★★★★」cout
됩니다.stdout
할 때는 를 들어, 예를 들어 ' 낫다', '보다 낫다'를 붙이는 방법이 .fprintf
인수를 더 in
★★★★★★★★★★★★★★★★★」out
그러나 더 우아한 방법이 있습니다. 기본 파일 ID를 덮어쓰고 출력을 받을 파일을 가리키도록 할 수 있습니다. dup
★★★★★★★★★★★★★★★★★」dup2
이 상황에서 정확히 작동합니다.
들어보겠습니다.를 들어, 예를 들어, 한다고 합시다.예를 들어, 다음의 출력에 리다이렉트 하는 것이,fprintf
"라는 이름의합니다.txt"라고 합니다. 이 합니다.
int fw=open("chinaisbetter.txt", O_APPEND|O_WRONLY);
는 ★★★★★★★★★★★★★★★★★★★★★★★★★★★★.stdout
를 사용하여 chinaisbetter.txt'로 하겠습니다.
dup2(fw,1);
여is stdout (1) "차이나가 좋다.txt"의 디스크립터를 가리키고 있지만 출력은 리다이렉트 됩니다.
ㄴ, ㄴ, ㄴ, ㄴ, ㄴ데.printf
결과는 화면에 직접 표시되지 않고 txt 파일로 표시됩니다.
printf("Are you kidding me? \n");
PS:
이는 직관적인 설명일 뿐이므로 manpage 또는 상세 정보를 확인해야 할 수 있습니다.사실 여기서 '복사'라고 하면 모든 걸 복사하는 게 아니에요.
여기서의 파일 ID는 파일의 핸들러를 참조하고 있습니다.위에서 설명한 파일 기술자는 레코드 파일의 정보 구조입니다.
POSIX 기능, 특히 중복되는 기능이 궁금할 때는 일반적으로 규격 자체를 확인하는 것이 좋습니다.아래에는 보통 예시와 두 가지 구현(및 존재)의 배후에 있는 추론이 표시됩니다.
이 경우:
다음 항은 도움이 됩니다.
예
표준 출력을 파일로 리다이렉트
다음 예제에서는 현재 프로세스의 표준 출력을 닫고 표준 출력을 에서 참조하는 파일로 이동하도록 재할당합니다.pfd
정리할 원래 파일 기술자를 닫습니다.
#include <unistd.h>
...
int pfd;
...
close(1);
dup(pfd);
close(pfd);
...
오류 메시지 리다이렉트
다음 예제에서는 메시지를 리다이렉트합니다.stderr
로.stdout
.
#include <unistd.h>
...
dup2(2, 1); // 2-stderr; 1-stdout
...
응용 프로그램 사용 현황
없음.
근거
그dup()
그리고.dup2()
기능이 장황합니다.또한 서비스 제공자는fcntl()
기능.이들은 많은 기존 애플리케이션이 사용하기 때문에 주로 역사적 이유로 IEEE 규격 1003.1-2001의 이 볼륨에 포함되어 있습니다.
표시된 간단한 코드 세그먼트는 다음과 매우 유사한 동작입니다.dup2()
IEEE 규격 1003.1-2001의 이 볼륨에 정의되어 있는 다른 기능에 근거한 준거 실장은 훨씬 복잡합니다.가장 분명한 것은 단계 간에 호출되어 파일 기술자를 할당 또는 할당 해제할 수 있는 신호 캡처 함수의 가능한 영향입니다.이는 신호를 차단함으로써 회피할 수 있습니다.
dup2()
는 objective 버전으로 .fcntl()
포식스 에이다
dup2()
기능은 동기 메커니즘으로 중요한 영역에서 사용하기 위한 것이 아닙니다.
[EBADF]의 설명에서 Fildes가 범위를 벗어나는 경우는 Fildes가 유효하지 않은 경우로 간주됩니다.의 fildes
★★★★★★★★★★★★★★★★★」fildes2
두 가지 다른 는 이 두 가지가 관련된 입니다.fildes2
하지 않습니다. 범위 밖인지 아닌지는 하지 않습니다.fildes2
있는 .dup2()
콜이 발신됩니다.
장래의 방향
없음.
「 」를 참조해 주세요.
close()
,fcntl()
,open()
IEEE IEEE 「1003.1-2001」의,<unistd.h>
이력 변경
제1호에서 처음 공개되었습니다.SVID의 제1호에서 파생되었습니다.
출력 메시지를 로그 파일 등의 다른 스트림으로 리다이렉트하는 경우가 있습니다.입출력하다
여기 원래 투고를 참조해 주세요.
#include <stdio.h>
main()
{
int fd;
fpos_t pos;
printf("stdout, ");
fflush(stdout);
fgetpos(stdout, &pos);
fd = dup(fileno(stdout));
freopen("stdout.out", "w", stdout);
f();
fflush(stdout);
dup2(fd, fileno(stdout));
close(fd);
clearerr(stdout);
fsetpos(stdout, &pos); /* for C9X */
printf("stdout again\n");
}
f()
{
printf("stdout in f()");
}
대부분의 경우 셸의 I/O 리다이렉션은 dup2/fcnlt 시스템콜을 사용하여 구현됩니다.
할 수 있습니다.$program 2>&1 > logfile.log
.
합니다.즉, stderr stderr의 동작을 .$program 2>&1 > output
dup2를 사용합니다.
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
int
main(void){
int close_this_fd;
dup2(close_this_fd = open("output", O_WRONLY), 1);
dup2(1,2);
close(close_this_fd);
fprintf(stdout, "standard output\n");
fprintf(stderr, "standard error\n");
fflush(stdout);
sleep(100); //sleep to examine the filedes in /proc/pid/fd level.
return;
}
vagrant@precise64:/vagrant/advC$ ./a.out
^Z
[2]+ Stopped ./a.out
vagrant@precise64:/vagrant/advC$ cat output
standard error
standard output
vagrant@precise64:/vagrant/advC$ ll /proc/2761/fd
total 0
dr-x------ 2 vagrant vagrant 0 Jun 20 22:07 ./
dr-xr-xr-x 8 vagrant vagrant 0 Jun 20 22:07 ../
lrwx------ 1 vagrant vagrant 64 Jun 20 22:07 0 -> /dev/pts/0
l-wx------ 1 vagrant vagrant 64 Jun 20 22:07 1 -> /vagrant/advC/output
l-wx------ 1 vagrant vagrant 64 Jun 20 22:07 2 -> /vagrant/advC/output
언급URL : https://stackoverflow.com/questions/1720535/practical-examples-use-dup-or-dup2
'sourcecode' 카테고리의 다른 글
타입 번호의 입력에 대해서, 증감 처리를 덮어쓰는 방법이 있습니까? (0) | 2022.08.03 |
---|---|
여러 스레드에서 stdlib의 rand() 사용 (0) | 2022.08.03 |
사용되지 않는 함수 매개 변수 값을 void로 캐스팅하는 이유는 무엇입니까? (0) | 2022.08.03 |
C의 구조 크기 (0) | 2022.08.03 |
vuex를 사용하여 이름 지정 모듈에서 getter에 액세스하려면 어떻게 해야 합니까? (0) | 2022.08.03 |