文件系统在程序运行期间转换为只读

时间:2012-06-13 01:34:32

标签: c file-io embedded-linux usb-drive

我的程序有一个运行initUSB()的循环,然后多次运行writeEssentials()。 initUSB()是一个将USB安装到目录的功能。 writeEssentials()是一个打开文件并将其附加数据的函数,然后关闭文件。

在程序初始运行一分钟后,程序将报告文件系统是“只读”,并将拒绝再写入数据,直到再次运行initUSB()。这种情况发生天气或不是我fprintf()进入文件指针。作为临时解决方案,我使writeEssentials()重新安装驱动器,如果它变为只读。这有效,但我不想每分钟重新安装一次。

为什么会发生这种情况,如何解决此错误?

该程序在TS-7800上的Debian嵌入式Linux系统上运行。

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");
}

1 个答案:

答案 0 :(得分:2)

检查dmesg。自发变为只读的文件系统通常表明存在一些被检测到的损坏,因此内核将FS设置为只读,以防止进一步损坏。