1

私のプログラムには、initUSB() を実行してから writeEssentials() を複数回実行するループがあります。initUSB() は、USB をディレクトリにマウントする関数です。writeEssentials() は、ファイルを開いてデータを追加し、ファイルを閉じる関数です。

プログラムの最初の実行から約 1 分後に、プログラムはファイル システムが「読み取り専用」であることを報告し、initUSB() が再度実行されるまでデータの書き込みを拒否します。これは、天候に関係なく発生します。ファイル ポインターに fprintf() します。一時的な解決策として、ドライブが読み取り専用になった場合に writeEssentials() でドライブを再マウントするようにしました。これは機能しますが、毎分ドライブを再マウントしたくありません。

このエラーが発生する理由と、このエラーを修正するにはどうすればよいですか?

このプログラムは、TS-7800 上の Debian 組み込み Linux システムで実行されています。

初期化 USB:

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

1 に答える 1

2

チェックしてくださいdmesg。ファイルシステムが自発的に読み取り専用になるのは、通常、検出されている破損があることを示しているため、カーネルはFSを読み取り専用に設定して、さらなる損傷から保護します。

于 2012-06-13T01:40:20.110 に答える