2012-06-13 3 views
1

내 프로그램에는 initUSB()를 실행 한 후 writeEssentials()를 여러 번 실행하는 루프가 있습니다. initUSB()는 USB를 디렉토리에 마운트하는 함수입니다. writeEssentials()는 파일을 열고 데이터와 함께 추가 한 다음 파일을 닫는 함수입니다.프로그램 실행 중에 읽기 전용으로 변환되는 파일 시스템

프로그램을 처음 실행 한 후 1 분 정도 지나면 프로그램은 파일 시스템이 "읽기 전용"이라고보고하고 initUSB()가 다시 실행될 때까지 더 이상 데이터 쓰기를 거부합니다. 이것은 날씨 또는 파일 포인터에 fprintf()가 발생하지 않습니다. 임시 해결 방안으로 writeEssentials()가 읽기 전용으로 설정된 경우 드라이브를 다시 마운트했습니다. 이 방법이 효과적이지만 매분마다 드라이브를 다시 마운트하지 않을 것입니다.

왜 이런 일이 발생하며 어떻게이 오류를 해결할 수 있습니까?

이 프로그램은 TS-7800의 데비안 임베디드 리눅스 시스템에서 실행됩니다.

InitUSB :

int initUSB(){ 
int i; 
FILE * filecheck = fopen(HMITelemCheckFile, "r"); 
for(i = 0; i < 26; i++) { 
    char usbMountFromPathTry[256]; 
    char sdanum[5]; 
    strcpy(usbMountFromPathTry, usbMountFromPath); 
    sprintf(sdanum, "%c1", i+'a'); 
    strcat(usbMountFromPathTry, sdanum); 
    if(!mount(usbMountFromPathTry, usbMountToPath, "vfat", (long)NULL, NULL)){ 
     printf("Mount successful\n"); 
     return 1; 
    } else if(!mount(usbMountFromPathTry, usbMountToPath, "vfat", MS_REMOUNT, NULL)){ 
     printf("Mount successful\n"); 
     return 1; 
    } 
    printf("Mount error: "); 
    printf("%s\n", usbMountFromPathTry); 
} 
printf("Mount ERROR\n"); 
return 0; 
} 

writeEssentials() :

void writeEssentials(){ 
FILE * file = fopen(usbMountEssentials, "a+"); 
fflush(file); 
perror("file"); 
if(file == NULL){ 
    initUSB(); 
    printf("null file\n"); 
    return; 
} 
fprintf(file, "\n%s, ", getDate()); 
fprintf(file, "%s, ", getTime()); 
fprintf(file, "%1.2f, ", getSpeed()); 
fprintf(file, "%d, ", getRPM()); 
fprintf(file, "%d, ", getRegen()); 
fprintf(file, "%d, ", getAirgap()); 
fprintf(file, "%d, ", getBattery()); 
fprintf(file, "%.2f, ", *(getADCTemps()+COMPUTER_BOX_TEMP_INDEX)); 
fprintf(file, "%.2f, ", *(getBMS()+BMS_TEMP_INDEX+(BMS_NUM_VAR*0))); 
fprintf(file, "%.2f, ", *(getBMS()+BMS_TEMP_INDEX+(BMS_NUM_VAR*1))); 
fprintf(file, "%.2f, ", *(getBMS()+BMS_TEMP_INDEX+(BMS_NUM_VAR*2))); 
fprintf(file, "%.2f, ", *(getMPPT()+MPPT_TEMP_INDEX+(MPPT_NUM_VAR*0))); 
fprintf(file, "%.2f, ", *(getMPPT()+MPPT_TEMP_INDEX+(MPPT_NUM_VAR*1))); 
fprintf(file, "%.2f, ", *(getMPPT()+MPPT_TEMP_INDEX+(MPPT_NUM_VAR*2))); 
fprintf(file, "%.2f, ", *(getMPPT()+MPPT_TEMP_INDEX+(MPPT_NUM_VAR*3))); 
fprintf(file, "%s, ", getLat()); 
fprintf(file, "%s, ", getLong()); 
int i; 
for(i = 0; i < getNumErrors(); i++){ 
    //fprintf(file, "%s, ", getErrorText(*(getErrors()+i))); 
} 
fclose(file); 
perror("close file error"); 
} 

답변

2

확인 dmesg. 자동으로 읽기 전용으로 진행되는 파일 시스템은 일반적으로 감지되는 손상이 있음을 나타냅니다. 따라서 커널은 FS를 추가 손상으로부터 보호하기 위해 읽기 전용으로 설정합니다. 그것이 무엇

+0

, 그것은 오류'FAT했다 : 읽기 전용 - '그래서 난 도망 파일 시스템이 설정되어 클러스터 심하게 계산 된 파일 시스템 패닉 (dev에 sda1과) (! 245 = 244)'fsck를 -r/dev/sda1', 그리고 지금은 작동하는 것 같습니다. 고맙습니다! – Reid