stat(2)
적절한 버퍼를 할당할 수 있도록 시스템 호출을 사용하여 파일 크기를 결정하려고 합니다 . 더 구체적으로 말하면 stat.st_size
시스템 호출로 채워진 구조체를 사용하고 있습니다 .
그러나 디버깅하는 동안 파일이 충분히 크면 문제가 발생할 수 있다는 것을 알았습니다. struct stat
매뉴얼 페이지에서는 이를 다음과 같이 정의합니다.
struct stat {
// ...
off_t st_size; /* total size, in bytes */
// ...
};
where 는 which st_size
로 정의되며 which 는 놀랍게도 does not 입니다 . 물론 이것은 충분히 큰 파일이 정수를 오버플로하여 값이 음수를 나타내게 하는 문제로 이어집니다. 내 수표에 있는 계좌(왜 음수인가요?)off_t
long int
unsigned long int
st_size
또한 매뉴얼 페이지에 따르면 EOVERFLOW
시스템 호출은 블록 수를 에 표시할 수 없는 경우 오류를 반환해야 off_t
하지만 gcc 9.3을 사용하는 로컬 우분투에서는 0x80000000
바이트보다 큰 크기의 파일에서는 이러한 오류가 발생하지 않습니다. 또한 "올바른" 방법은 필드를 32비트 정수에서 64비트 정수로 확장 -D_FILE_OFFSET_BITS=64
하도록 컴파일하는 것입니다. 이는 더 큰 파일을 관리하는 데 도움이 될 수 있습니다.off_t
이것은 확실히 내 문제를 해결했지만 여전히 궁금합니다. 정의를 부호 있는 정수로 유지하는 이유는 무엇입니까?
답변1
off_t
예POSIX에 의해 정의됨, 그리고
파일 크기.
파일 크기뿐만 아니라 파일 오프셋(따라서 이름)에도 사용되기 때문에 음수 값을 표현할 수 있어야 하며, 오프셋은 음수가 될 수 있습니다(파일에서 뒤로 이동).lseek
예를 들어).
왜 이것을 대신 사용할 수 없는지 궁금할 수도 있지만 size_t
이는 파일 크기가 아닌 개체, 특히 C 개체의 크기를 측정하는 데 사용됩니다.