내가 거의 전체디스크가 가득 차면 fwrite가 실패하지 않습니까?
tmpfs 36G 36G 92K 100% /dev/shm
으로는/dev/SHM을 채우기 위해 노력하고
$ ./a.out 93
failed to close
내 glibc에
$ /lib/libc.so.6
GNU C Library stable release version 2.12, by Roland McGrath et al.
를 실행 내가
int main(int argc, const char* argv[])
{
const char name[1024] = "/dev/shm/test_file";
off_t len = atol(argv[argc - 1]);
char buf[1024];
FILE * f = fopen(name, "w");
for (int i = 0; i < len; i++) {
int ret = fwrite(buf, 1024, 1, f);
if (ret != 1) {
printf("disk full\n");
}
}
if (fclose(f) != 0)
printf("failed to close\n");
return 0;
}
을 쓴 테스트 프로그램입니다
커널 버전은 2.6.32-642.13.1.el6.x86_64입니다.
이 문제는 fwrite가 메모리에 데이터를 캐시하려고 시도한 것으로 이해합니다. (나는 setvbuf (NULL ...)을 시도하고 fwrite는 즉시 실패를 리턴한다). 그러나 이것은에 fwrite() 함수는 쓰기 오류가 발생 경우 NITEMS보다 적을 수 있습니다 원소의 개수 작성 성공적으로 을 반환한다 정의
에서 조금 다른 것 같다. size 또는 nitems가 0이면 fwrite()는 0을 반환하고 스트림의 상태는 변경되지 않습니다. 그렇지 않으면 쓰기 오류 이 발생하면 스트림에 대한 오류 표시기가 설정되고 [CX] [Option 시작] errno는 오류를 나타내도록 설정됩니다. [옵션 끝]
데이터가 디스크에 성공적으로 기록되지 않았지만 반환 값은 1입니다. errno는 설정되지 않았습니다. 이 테스트 케이스에서는 fclose가 실패를 catch합니다. 그러나 그것은 매우 혼란스러운 ftell 함수조차도 잡힐 수 있습니다.
이것이 glibc의 모든 버전에 발생하는지 궁금하며, 버그라고 생각합니다.