일반적인 시스템 호출 인터페이스를 사용하면 파일 크기를 줄일 수 있습니까(다른 inode로 교체하지 않고)?

일반적인 시스템 호출 인터페이스를 사용하면 파일 크기를 줄일 수 있습니까(다른 inode로 교체하지 않고)?

open()파일을 더 작게 만드는 방법이 있나요 ? 물론 추가 모드로 열 수도 있고, 끝까지 탐색하여 성장하도록 쓸 수도 있습니다. 그러나 내가 아는 한 일반적인 유닉스 스타일 시스템 호출 인터페이스를 통해 파일을 축소할 수 있는 방법은 없습니다.

내가 아는 한, 이를 수행하는 유일한 방법은 더 짧은 새 파일을 만들고 rename()이전 파일을 교체하여 가짜로 만드는 것입니다.

그냥 그 자리에서 새 파일을 만들고 이름을 바꾸는 과정을 거치지 않고 파일에서 직접 작동하는 파일 편집기를 만드는 것이 가능하다는 답변을 봐서 확인하고 싶었습니다.

나는 항상 libc의 파일 API와 유닉스 스타일 시스템 호출 인터페이스가 파일 시스템 구현을 단순화하고 조각화로 이어질 수 있는 사용 패턴을 피하기 위해 파일을 축소하는 것을 허용하지 않는다고 생각했습니다.

답변1

man -s 2 ftruncate설명하다

DESCRIPTION
   The  truncate()  and  ftruncate()  functions cause the regular file
   named by path or referenced by fd to be truncated to a size of precisely
   length bytes.

...

CONFORMING TO
   POSIX.1-2001, POSIX.1-2008, 4.4BSD, SVr4 (these calls first appeared in 4.2BSD).

계속해서 ftruncate를 사용하면 쓰기 위해 파일을 열어야 하고, truncate를 사용하면 파일을 쓸 수 있어야 한다고 말합니다.

답변2

이것open(2)시스템 호출은 O_TRUNC파일 크기를 줄일 수 있는 플래그를 허용합니다.

O_TRUNC– 파일이 존재하고 일반 파일이고 파일이 성공적으로 열렸 O_RDWR거나 파일이 열리면 O_WRONLY파일 길이가 0으로 잘리고 모드와 소유자는 변경되지 않습니다. FIFO 특수 파일이나 터미널 장치 파일에는 영향을 미치지 않습니다. 다른 파일 유형에 미치는 영향은 구현에 따라 정의됩니다. or 를 O_TRUNC사용하지 않은 결과 는 정의되지 않았습니다.O_RDWRO_WRONLY

프로그램이 파일 내용을 완전히 덮어쓰는 것을 목표로 할 때 자주 사용됩니다. 에 표시된 대로 셸의 파일 리디렉션 연산자를 예로 들 수 있습니다 command > file.

관련 정보