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


9

open()파일 로가는 방법이 있습니까? 물론, 그것들을 추가 모드로 열거 나 끝까지 찾아서 자라도록 할 수 있습니다. 그러나 내가 아는 한 일반적인 유닉스 스타일 시스템 호출 인터페이스를 통해 파일을 축소하는 방법은 없습니다.

내가 아는 한, 그렇게하는 유일한 방법은 더 짧은 파일을 새로 만들어 rename()이전 파일 대신 만들어내는 것입니다.

방금 확인을 원했습니다. 새 파일을 만들고 이름을 바꾸는 과정을 거치지 않고 파일에서 직접 작업 한 파일 편집기를 만들 수 있음을 암시하는 대답을 보았 기 때문에 확인을 원했습니다.

필자는 항상 libc 및 유닉스 스타일 시스템 호출 인터페이스의 파일 API가 파일 시스템을 쉽게 구현하고 조각화에 기여할 수있는 사용 패턴을 피하기 위해 파일 축소를 허용하지 않았다고 생각했습니다.


2
fopen"w"(또는 "w +") 모드에서 파일을 열면 자동으로 길이가 0으로 잘립니다. 아니면 오래된 내용 중 일부를 보존하기 위해 0이 아닌 크기로 축소하는 것을 의미합니까?
Wyzard

4
그냥 참고로, open()그리고 openat()이미 절단에 대한 플래그를 가지고 O_TRUNC즉, 완전히 수축 - - 아이 노드를 변경하지 않고 너무 기술적으로는 파일을 축소하는 원인 않습니다. 가장 유명한 예는입니다 command > file.txt. 여기서 파일은 존재하는 경우 잘립니다. 당신이 실행하는 경우 stracebash -c 'true > /dev/null'당신이 볼 수 openat(AT_FDCWD, "/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666)출력에. 물론 다양한 크기의 잘림을 위해서는 truncate()syscall 이 필요합니다 . 이것을 의견 대신 실제 답변으로 원하는지 알려주십시오.
Sergiy Kolodyazhnyy

@ SergiyKolodyazhnyy 나는 임의의 크기로 축소하려고 생각했습니다. David Foerster의 답변은 질문의 일부에 답변하기 때문에 대답했지만, 나는 이카루스에 비추어 받아들이지 않습니다. 나는 이것을 예와 아니오 형식의 대답으로 받아 들였을 것인데, 이카루스의 대답은 이미 실제 대답이 "예"라는 것을 보여주었습니다.
JoL

답변:


22

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를 사용하면 파일을 쓸 수 있어야합니다.


파일에 추가하면 OS가 먼저 truncate새 파일 크기를 수용 한 다음 파일을 수용 write합니다. truncate당신이 찾고있는 시스템 호출도 마찬가지 입니다.
mgarciaisaia

1
Linux에서도 참조fallocate(FALLOC_FL_COLLAPSE_RANGE)
Stéphane Chazelas

2

open(2)시스템 호출은 허용 O_TRUNC파일 크기를 줄일 수 있습니다 플래그 :

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.