내가 아는 한, 운영 파일의 경우 Linux에는 파일 내용을 덮어쓰는(또는 마지막 경우 확장하는) sys_write 시스템 호출만 있습니다.
파일에 콘텐츠를 삽입하거나 삭제하기 위한 시스템 호출이 Linux에 없는 이유는 무엇입니까?
현재의 모든 파일 시스템에서는 인접한 메모리 블록에 파일을 저장할 필요가 없으므로 효율적인 구현이 가능해야 합니다. (파일이 조각화됩니다.)
현재 콘텐츠를 삽입하는 방법은 "쓰기 시 복사" 또는 "투명 파일 압축"과 같은 파일 시스템 기능으로 인해 매우 비효율적인 것 같습니다.
답변1
이는 실제로 최근 Linux 시스템에서는 가능하지만막힌(대부분 4096), 아니요바이트세분성, 특정 파일 시스템(ext4 및 xfs)에서만 가능합니다.
에서 인용fallocate(2)
맨페이지:
int fallocate(int fd, int mode, off_t offset, off_t len);
[...]
파일 공간 충돌
구멍을 남기지 않고 파일에서 바이트 범위를 제거
FALLOC_FL_COLLAPSE_RANGE
하려면 플래그(Linux 3.15부터 사용 가능)를 지정하십시오 . 시작하여 바이트 단위로 계속해서mode
접을 바이트 범위입니다 . 작업이 완료되면 해당 위치에서 시작하는 파일 내용이 해당 위치에 추가되고 파일의 바이트 수가 줄어듭니다.offset
len
offset+len
offset
len
[...]
파일 공간 늘리기
기존 데이터를 덮어쓰지 않고 파일 크기에 구멍을 삽입하여 파일 공간을 늘리려면
FALLOC_FL_INSERT_RANGE
플래그(Linux 4.1부터 사용 가능)를 지정하십시오 .mode
구멍은 거기서 시작하여 바이트를offset
계속합니다len
. 파일 내에 구멍이 삽입되면 에서 시작하는 파일 내용이offset
위로(즉, 더 높은 파일 오프셋으로) 바이트 이동됩니다len
. 파일에 구멍을 삽입하면 파일 크기가len
바이트 단위로 늘어납니다.
답변2
현재의 모든 파일 시스템에서는 인접한 메모리 블록에 파일을 저장할 필요가 없으므로,
파일 시스템은 인접한 영역에 파일을 저장할 필요가 없을 수도 있지만(이는 실제로 매우 유연하지 않음) 파일이 고정 크기 블록(또는 일련의 연속 블록)에 저장되는 경우가 많습니다. 이는 구현을 단순화하며 블록은 일반적으로 기본 장치 블록 크기의 배수입니다.
따라서 임의 길이의 블록 삽입을 구현하면 파일 시스템 형식과 구현이 더 복잡해지거나 잠재적으로 많은 양의 데이터를 이동해야 합니다. 이 중 어느 것도 좋지 않으며 파일 시스템 API 위에 사용자 공간에 복잡한 데이터 구조를 구축할 수 있습니다.