[c] 쓰기가 버퍼에 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 바이트가 일관되게 남아 있습니다. 루프에서 쓰기를 래핑하고 버퍼를 위로 이동 하여이 문제를 해결할 수 있지만 왜 항상 실패하는지 궁금합니다.

예를 들어 size가 2147483648 인 경우 쓰기는 2147479552 만 작성하고 4096은 쓰지 않습니다. 왜 이런 일이 발생하고 항상 루프에서 쓰기를 래핑하는 것이 맞습니까?



답변

당신은 대답을 찾을 수 있습니다 man 2 write:

이 수가 요청 된 바이트 수보다 작은 경우 오류가 아닙니다. 예를 들어 디스크 장치가 가득 차서 발생할 수 있습니다.


그리고 write()매뉴얼 페이지 설명에서 :

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

POSIX.1에 따르면, count보다 크면 SSIZE_MAX결과는 구현 정의됩니다. Linux 상한에 대한 참고 사항을 참조하십시오.

노트

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


답변