일반적인 시스템 호출 인터페이스를 사용하면 파일 크기를 줄일 수 있습니까(다른 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 특수 파일이나 터미널 장치 파일에는 영향을 미치지 않습니다. 다른 파일 유형에 미치는 영향은 구현에 따라 정의됩니다. 또는 O_TRUNC중 하나 없이 사용한 결과 는 정의되지 않습니다.O_RDWRO_WRONLY

프로그램이 파일의 내용을 완전히 덮어쓰려고 할 때 자주 사용됩니다. 예를 들어 셸의 파일 리디렉션 연산자가 있습니다 command > file.

관련 정보