developer tip

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

copycodes 2020. 10. 22. 08:11
반응형

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).  

시스템 호출이 필요한 이유는 무엇입니까? 파일 설명자를 복제하는 용도는 무엇입니까?

파일 설명자가있는 경우 복사본을 만드는 이유는 무엇입니까?

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먼저 복제해야합니다 .


Some points related to dup/dup2 can be noted please

dup/dup2 - Technically the purpose is to share one File table Entry inside a single process by different handles. ( If we are forking the descriptor is duplicated by default in the child process and the file table entry is also shared).

That means we can have more than one file descriptor having possibly different attributes for one single open file table entry using dup/dup2 function.

(Though seems currently only FD_CLOEXEC flag is the only attribute for a file descriptor).

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

Differences are (for the last)- Apart from some errno value beteen dup2 and fcntl close followed by fcntl may raise race conditions since two function calls are involved.

Details can be checked from http://pubs.opengroup.org/onlinepubs/009695399/functions/dup.html

An Example of use -

One interesting example while implementing job control in a shell, where the use of dup/dup2 can be seen ..in the link below

http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs


dup is used to be able to redirect the output from a process.

For example, if you want to save the output from a process, you duplicate the output (fd=1), you redirect the duplicated fd to a file, then fork and execute the process, and when the process finishes, you redirect again the saved fd to output.

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

반응형