dup 예제

다음 예제에서는 유닉스 파이프를 사용하여 두 개의 개별 프로세스(program1 및 program2)를 연결하기 위해 pipe() 및 dup()를 사용합니다. 이제 셸에서 수행하는 대신 fork(), exec() 및 dup2()를 호출하여 « cat f2″를 실행한다고 가정합니다. catf1f2.c에서 이 작업을 수행할 수 있습니다. 이것은 stdin (fd0)에서 읽기위한 f1을 열고 stdout (fd1)에 쓰기위한 f2가 열립니다. 아마도 당신은 생각하고, `그는 파일을 열고 포크 ()를 호출합니다. 그는 마지막 실험실에서 그 버퍼 복사 문제에 대해 걱정해야 합니까?«  시스템 호출인 write()를 사용하고 버퍼링이 없기 때문에 대답은 `아니오`입니다. 표준 I/O 라이브러리를 사용할 때 버퍼링 문제에 대해 걱정할 필요가 있고 fork()가 호출될 때 버퍼가 비어 있지 않습니다. 예를 들어 fs3a.c 및 fs3b.c를 살펴보십시오. 쓰기() 대신 fprintf()를 사용합니다. 내가 그들을 호출 할 때, 나는 다음을 얻을 : 예를 들어, dup2ex.c봐. 이렇게 하면 쓰기를 위해 파일 4가 열리고 dup2를 사용하여 표준 출력을 해당 파일로 리디렉션합니다.

작업이 완료되면 모든 것이 intto file4: dup 및 dup2 호출은 POSIX 사양에 따라 표준화됩니다. [1] 유닉스 쉘은 입력/출력 리디렉션에 dup2를 사용합니다. 파이프()와 함께 유닉스 파이프가 의존하는 도구입니다. 전자는 open() 처럼 사용 가능한 첫 번째 설명자가 할당됩니다. 파일 설명기를 지정되지 않은 위치에 복제하는 다른 방법은 F_DUPFD 명령이 있는 fcntl 시스템 호출입니다. dup2() 함수는 fcntl()에 의해 형식 안전하지 않은 버전에서 제공되는 형식 안전 버전의 기능을 제공하므로 사용되지 않는 것으로 표시되지 않습니다. POSIX Ada 바인딩에 사용됩니다. 참고: 프로세스의 모든 속성이 exec 호출에서 변경되지는 않습니다.

즉, 새 프로세스는 호출 프로세스에서 여러 속성을 상속합니다: 표시된 간단한 코드 세그먼트는 dup2()와 동작에서 매우 유사하지만, IEEE Std 1003.1-2001 볼륨에 정의된 다른 함수를 기반으로 하는 준수 구현은 훨씬 더 복잡합니다. 단계 간에 호출되고 파일 설명자 할당 또는 할당 해제할 수 있는 신호 catch 함수의 가능한 효과는 분명하지 않습니다. 이는 신호를 차단하여 피할 수 있습니다. 운영 체제 (OS)는 파일에 대 한 데이터 구조의 세 가지 종류가 있습니다: dup(사용 하 여), 표준 출력에 대 한 별칭을 만들 수 있습니다., 다음과 같이: . fs1.c(fs2.c)의 변경 내용을 살펴보십시오. fd2를 초기화하기 위해 open()을 호출하는 대신 dup(fd1)를 호출합니다. 따라서 첫 번째 쓰기 후 fd2의 lseek 포인터가 fd1에 대한 쓰기를 반영하도록 업데이트되었습니다 . #include int dup(int fildes); int dup2(int fildes, int fildes2); 따라서 fs2.c를 실행한 후 파일 « file2″는 « JimnPlankn »이라고 말해야 합니다.

fs1a.c와 마찬가지로 fs2a.c는 각 단계에서 fd1 및 fd2의 lseek 포인터를 인쇄합니다. 당신이 볼 수 있듯이, write() fd1 업데이트 fd2에 대 한 lseek 포인터: 코드를 실행 하기 전에 쓰기 작업 전에 파일 « dup.txt » 아래 와 같이: 후자의 경우 newfd에 복사본을 배치 합니다. newfd가 열려 있으면 먼저 닫힙싸습니다. 이를 보다 명확하게 하기 위해 fs1a.c는 프로그램의 각 단계에서 각 fd의 검색 포인터 값을 인쇄합니다.