programing

쓰기가 버퍼에 지속적으로 4K 바이트를 남기는 이유는 무엇입니까?

jooyons 2023. 10. 27. 21:54
반응형

쓰기가 버퍼에 지속적으로 4K 바이트를 남기는 이유는 무엇입니까?

기본적으로 다음과 같은 코드가 있습니다.

int fileWrite(int file, void * pBuffer, size_t size)
{
    size_t bytesWritten = (size_t)write( file, pBuffer, size ) ;
    if (bytesWritten != size)
    {
       return -1;
    }
    return 0;
}

크기가 1GB일 경우 작동하지만 ~2GB일 경우 4K 바이트가 일정하게 남아있습니다.write를 loop에 싸서 버퍼를 위로 이동시키면 고칠 수 있는데 왜 항상 고장이 나는지 궁금합니다.

예를 들어 크기가 2147483648인 경우 write는 2147479552만 기록하고 4096은 기록하지 않습니다.왜 이런 일이 발생하며 항상 루프로 쓰기를 랩핑하는 것이 올바른가요?

다음에서 답을 찾을 수 있습니다.man 2 write:

이 숫자가 요청된 바이트 수보다 작으면 오류가 아닙니다. 예를 들어 디스크 장치가 가득 찼기 때문에 발생할 수 있습니다.


그리고 맨페이지의 설명에서:

ssize_t write(int fd, const void *buf, size_t count);

POSIX.1에 따르면, 만약count보다 큼SSIZE_MAX, 결과는 구현에 정의되어 있습니다. Linux의 상한에 대해서는 참고를 참조하십시오.

메모들

리눅스에서,write()(및 유사한 시스템 호출)이 최대 전송됩니다.0x7ffff000(2,147,479,552) 바이트로, 실제로 전송된 바이트 수를 반환합니다.(이는 32비트 시스템과 64비트 시스템 모두에서 해당됩니다.)

언급URL : https://stackoverflow.com/questions/61146723/why-does-write-continuously-leave-4k-bytes-in-the-buffer

반응형