stdio.h의 BUFSIZ와 blockdev의 블록 크기의 차이점은 무엇입니까?

stdio.h의 BUFSIZ와 blockdev의 블록 크기의 차이점은 무엇입니까?

내가 읽고있다유닉스 프로그래밍 환경(1984). 7장(유닉스 시스템 호출)에서 저자는 다음과 같이 말합니다.

읽거나 쓰는 바이트 수에는 제한이 없지만 가장 일반적인 값은 1(한 번에 한 문자)이고... 디스크의 블록 크기는 가장 일반적으로 512 또는 512입니다. 1024바이트.(<stdio.h>의 BUFSIZ 매개변수에 이 값이 있습니다.)

나는 이것을 확인하기 위해 간단한 프로그램을 작성했습니다.

#include <stdio.h>

int main()
{
    printf("The BUFSIZ is %d\n", BUFSIZ);
    return 0;
}

내 시스템에서 반환(Linux Mint)8192. 책에서 언급한 '512나 1024'보다 훨씬 많은 숫자다. 나는 이것이 역사적 상황의 차이에 기초해야 한다고 생각합니다.

호기심 때문에 나는 C 프로그램을 직접 작성하지 않고 이 블록 크기를 찾는 다른 방법을 찾았고 다음과 같은 내용을 발견했습니다 blockdev.

me@mint:~/src/c/unixprogenvbk$ sudo blockdev --getbsz /dev/sda1
4096

BUFSIZ 값이 8192인데 왜 4096인가요? 이것은 실제로 두 가지 다른 것입니까?

답변1

그 구절이 어디서 나오는지는 잘 모르겠지만유닉스 프로그래밍 환경의미는 있지만 BUFSIZ디스크 블록 크기와는 아무 관련이 없다고 생각합니다. 불가능하고 BUFSIZ일정하며 디스크마다 다른 블록 크기를 가질 수 있습니다(NVMe 및 NVDIMM과 같은 일부 장치는 블록 크기 변경도 지원합니다).

나는 이 정의를 좋아한다glibc 문서더:

이 매크로의 값은 setvbuf의 크기 매개변수로 사용하기에 적합한 정수 상수 표현식입니다. 이 값은 최소 256이 보장됩니다. BUFSIZ의 값은 스트리밍 I/O 효율성을 향상시키기 위해 시스템별로 선택됩니다. 따라서 setvbuf를 호출할 때 버퍼 크기로 BUFSIZ를 사용하는 것이 가장 좋습니다.

하지만 to로 설정된 상수만 stdio.h있고 왜 문서에 각 시스템에 대해 선택되었다고 나와 있는지 잘 모르겠습니다.BUFSIZ8192

blockdevioctl을 사용하여 BLKBSZGET지정된 장치의 블록 크기를 얻으므로 이것이 디스크의 실제 블록 크기입니다.

관련 정보