sourcecode

dup2 / dup - 파일 기술자를 복제해야 하는 이유는 무엇입니까?

copyscript 2022. 9. 16. 23:03
반응형

dup2 / dup - 파일 기술자를 복제해야 하는 이유는 무엇입니까?

지금 중입니다.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).  

시스템 콜이 필요한 이유는 무엇입니까?파일 기술자를 복제하는 것이 무슨 소용이 있습니까?

파일 기술자가 있는데 왜 복사해야 합니까?

dup2dup요합니니다다

감사합니다.

dup 시스템 호출은 기존 파일 기술자를 복제하여 동일한 기본 I/O 개체를 참조하는 새 파일 기술자를 반환합니다.

Dup을 사용하면 셸이 다음과 같은 명령을 구현할 수 있습니다.

ls existing-file non-existing-file > tmp1  2>&1

2 > & 1 명과 、 1 、 2 、 2 를((((((( ( fd ( st st, stderr & stdout point to same fd ) 。
존재하지 않는 파일에 대한 호출 오류 메시지와 기존 파일에 대한 올바른 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 표 wc wc wc wc wc wc wc wc wc wc wc wc wc wc wc
이것이 dup을 사용하여 파이프가 구현되는 방법입니다.그것이 시스템 호출의 장점입니다.이미 존재하는 툴을 사용하여 다른 것을 사용하여 파이프를 구축합니다.이러한 툴은 다른 것을 사용하여 구축되었습니다. 끝의 에 있는 입니다.

건배 :)

하는 또 다른 는 파일 를 사용하다와 함께 사용하는 입니다.fdopenfclose.fdopendup 번째

dup은 프로세스에서 출력을 리다이렉트하기 위해 사용됩니다.

예를 들어 프로세스의 출력을 저장하려면 출력(fd=1)을 복제하고 복제된 fd를 파일로 리디렉션한 다음 프로세스를 포크하여 실행하고 프로세스가 완료되면 저장된 fd를 출력으로 다시 리디렉션합니다.

dup/dup2와 관련된 몇 가지 사항에 유의하십시오.

dup/dup2 - 기술적으로 목적은 1개의 프로세스 내에서1개의 파일테이블 엔트리를 서로 다른 핸들에 의해 공유하는 것입니다.(포킹할 경우 디스크립터는 기본적으로 자프로세스에서 복제되며 파일테이블 엔트리가 공유됩니다).

즉, 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);

차이는 (마지막에 대한) 일부 에러노 값 been dup2와 fcntl close를 제외하고 fcntl에 이어 fcntl이 계속되면 2개의 함수 호출이 관련되어 있기 때문에 레이스 조건이 높아질 수 있습니다.

자세한 내용은 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

언급URL : https://stackoverflow.com/questions/11635219/dup2-dup-why-would-i-need-to-duplicate-a-file-descriptor

반응형