stat.st_size 유형이 unsigned int가 아닌 이유는 무엇입니까?

stat.st_size 유형이 unsigned int가 아닌 이유는 무엇입니까?

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_tlong intunsigned long intst_size

또한 매뉴얼 페이지에 따르면 EOVERFLOW시스템 호출은 블록 수를 에 표시할 수 없는 경우 오류를 반환해야 off_t하지만 gcc 9.3을 사용하는 로컬 우분투에서는 0x80000000바이트보다 큰 크기의 파일에서는 이러한 오류가 발생하지 않습니다. 또한 "올바른" 방법은 필드를 32비트 정수에서 64비트 정수로 확장 -D_FILE_OFFSET_BITS=64하도록 컴파일하는 것입니다. 이는 더 큰 파일을 관리하는 데 도움이 될 수 있습니다.off_t

이것은 확실히 내 문제를 해결했지만 여전히 궁금합니다. 정의를 부호 있는 정수로 유지하는 이유는 무엇입니까?

답변1

off_tPOSIX에 의해 정의됨, 그리고

파일 크기.

파일 크기뿐만 아니라 파일 오프셋(따라서 이름)에도 사용되기 때문에 음수 값을 표현할 수 있어야 하며, 오프셋은 음수가 될 수 있습니다(파일에서 뒤로 이동).lseek예를 들어).

왜 이것을 대신 사용할 수 없는지 궁금할 수도 있지만 size_t이는 파일 크기가 아닌 개체, 특히 C 개체의 크기를 측정하는 데 사용됩니다.

관련 정보