2017-11-21 24 views
0
여기

내가 거의 전체디스크가 가득 차면 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의 모든 버전에 발생하는지 궁금하며, 버그라고 생각합니다.

답변

0

데이터가 성공적으로 디스크

표준 디스크에 대해 이야기하지 않습니다에 기록되지 않았습니다. 그것은 스트림에 성공적으로 쓰여진 데이터에 대해 말하고 있습니다. 이

가장 가능성의 glibc의 모든 버전에 무슨 일이 생기면

은 궁금입니다.

이는 버그로 간주됩니다.

fwrite의 요구 사항 해석에 버그가 있습니다.