2014-06-07 8 views
0

디스크 파일과 마찬가지로 일 가능성이있는 경우 실제 파일 디스크립터 복제 메커니즘 이없는 이유는 무엇입니까?트루 파일 디스크립터 클론

는 POSIX :이 시스템 호출 중 하나, 이전 및 새로운 파일 기술자에서 성공적으로 복귀 한 후

는 상호 교환하여 사용될 수있다. 그것들은 동일한 열린 파일 설명 (open (2) 참조)을 참조하므로 파일 오프셋 과 파일 상태 플래그를 공유합니다. 예를 들어, 설명자 중 하나에서 lseek (2)를 사용하여 파일 오프셋이 으로 수정 된 경우 오프셋은 다른 파일에 대해 으로 변경됩니다.

윈도우 :

중복 핸들은 원래 핸들과 같은 객체를 참조. 따라서 개체에 대한 변경 내용은 두 핸들을 통해 반영됩니다. 예를 들어, 파일 핸들을 복제하는 경우 현재 파일 위치는 항상 두 핸들에서 동일합니다. 파일 핸들이 다른 파일 위치를 가지려면 CreateFile 함수를 사용하여 동일한 파일에 대한 액세스를 공유하는 파일 핸들을 만듭니다. 원시 복제를 가지고위한

이유 :

  • 파일 아카이브를 조작, 나는 아카이브에 각 파일에 독립적으로 액세스 할 수 있습니다합니다. 파일 보관소는 가상 파일 시스템처럼 작동해야합니다.

  • 파일 형식 검사. 파일 오프셋을 복제 할 수 있기 때문에 원래 위치에 영향을주지 않고 파일의 작은 부분을 읽을 수 있습니다.

+0

나는 그것이 존재한다고 생각했다 : dup(). http://man7.org/linux/manage/man2/dup.2.html 예, dup()은 동일한 오프셋을 공유하지만 여전히 다른 설명자 플래그를 유지합니다. 양자 택일로 u는 언제나 파일을 두 개의 서로 다른 디스크립터로 mmap 할 수 있으며, 서로 다른 디스크립터의 오프셋을 사용하여 문제를 해결할 수 있습니까? –

+0

@PeterTeoh 사실, 플래그를 공유하고 싶지만 오프셋은 공유하고 싶지 않습니다. – user877329

답변

0

다음을 고려해야합니다. 파일 설명자는 커널 측에서 "파일"(실제로는 그 이름이라고 불리는) 배열의 배열에 대한 오프셋 일뿐입니다. 따라서 파일 디스크립터를 복제하면 커널은 파일 포인터의 값을 배열의 한 위치에서 다른 위치로 간단히 복사하고 지시 된 객체의 참조 카운트를 증가시킵니다.

따라서 파일 설명자 중복이 아니라 파일 오프셋을 관리하는 것이 중요합니다. 이에 대한 쉬운 대답은 직접하십시오. 즉, 현재 파일 오프셋을 응용 프로그램 측의 각 파일 설명자와 명시 적으로 연관시킵니다.

물론 가장 기본적인 파일 액세스 시스템 인 read()write()은 커널 유지 관리 파일 오프셋 변수를 사용합니다 (사용 가능한 경우 "정상"임의 액세스 파일을 처리하는 경우에만 사용할 수 있습니다). 그러나 고급 파일 액세스 시스템 호출에서는 각 호출시 응용 프로그램이 원하는 파일 오프셋을 제공해야합니다. 여기에는 pread()/pwrite(), preadv()/pwritev()aio_read()/aio_write이 포함됩니다 (앞에서 설명한 것과 같은 병렬 액세스 응용 프로그램을 작성하는 가장 좋은 방법 일 수 있습니다). Windows에서

은/ WriteFile() ReadFile(), ReadFileScatter()/ WriteFileGather()ReadFileEx()/ WriteFileEx()은 유사합니다 ( lpOverlapped 인수를 통해) 모든 호출에 파일 오프셋을 전달할 수 있어야합니다.