본질적으로 다음 코드가 있습니다.
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 비트 시스템 모두에 해당됩니다.