본질적으로 다음 코드가 있습니다.
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은 쓰지 않습니다. 왜 이런 일이 발생하고 항상 루프에서 쓰기를 래핑하는 것이 맞습니까?
2
32 비트 모드로 실행 중입니까? 2gig는 최대 32 비트 숫자입니다.
—
Barmar
write
한 번에 소비되는 데이터 양에 대한 규칙은 file
"일반"파일, 파이프, 스트림 소켓, 데이터 그램 소켓 등 의 데이터 싱크 유형에 따라 다릅니다 . 더 자세하게 얘기해 주 시겠어요?
잠깐,
—
루안
write
한 번에 전체 파일 을 보려고 합니까? 일반적인 접근 방식은 모든 것을 쓸 때까지 한 번에 버퍼 크기로 데이터를 스트리밍하는 것입니다.
@Luaan 이미 모든 데이터를 가지고 있다면 한 번에 잘못 쓰는 것이 없다는 것을 알지 못하지만이 질문과 답변에서 알 수 있듯이
—
파이프
write()
모든 것을 쓸 필요는 없습니다 (작은 버퍼에도 적용됨)
"루프에 쓰기를 래핑하여이 문제를 해결할 수 있습니다."
—
아담
SSIZE_MAX
제한에 관계없이해야합니다 . write()
사양은 거의 항상 않는 경우에도 전체 버퍼를 작성하는 의무를 말한다. 문제의 루프리스 코드는 버그입니다.