2016-09-06 86 views
3

有兩個程序正在同時處理我的特殊文件。他們有一個共同的起點:儘管文件已被其他程序更改,但fread並未讀取更新值

#define TASK_POSITION 0x0100 

    #include <stdio.h> 
    #include <stdlib.h> 
    #include <inttypes.h> 

    int main() { 

     FILE * control_file; 
     unsigned int task_code; 
     fpos_t task_position; 

     control_file = fopen("/home/anonymous/.control", "r+"); 
     fseek(control_file, TASK_POSITION, SEEK_SET); 
     fgetpos(control_file, &task_position); 

但後來他們有一個非常不同的代碼

  • 第一個程序可能改變在TASK_POSITION此文件的偏移值:

    /* ... lots of code there ... */ 
    
        task_code = 0xFEEDFACE; 
    
        fsetpos(control_file, &task_position); 
        fwrite(&task_code, 4, 1, control_file); 
         fflush(control_file); 
         sleep(1); 
    
        fclose(control_file); 
        return 0; 
    } 
    
  • 第二程序在該文件的相同偏移量處反覆出現一個值:

    for (;;) { 
         fsetpos(control_file, &task_position); 
         fread(&task_code, 4, 1, control_file); 
         if (task_code == 0xFEEDFACE) { 
          /* ... Do something awesome! ... */ 
         } 
         else { // remove after debugging 
          fprintf(stdout, "not hungry yet :P 0x%08x value has been read... \n"); 
          fflush(stdout); 
         } 
         sleep(60); 
        } 
    
        // just in case 
        fclose(control_file); 
        return 0; 
    } 
    

默認情況下,存儲在TASK_POSITION偏移處的值爲0x12345678。

這裏有一個問題:

後的第一個程序已經啓動並完成了的工作,我可以在十六進制編輯器是一個特殊的文件已經成功地改變了看。然而:對於我來說一些未知的原因,fread的第二個程序不斷讀取相同的舊值 - 0x12345678!

雖然我在第二個程序的無限循環(fread檢查之間)的每次迭代期間通過fclosing/fopening這個文件發現了一個臨時解決方法,但它看起來並不是最好的解決方案!請告訴:如何強迫fread實際重新讀取文件中的新值,而不是僅返回先前讀取的值(從其「緩存??」)?

回答

3

C的標準I/O功能通常被緩衝。要禁用緩存,你可以這樣做:

setvbuf(control_file, NULL, _IONBUF, 0); 

立即你打開文件後,你就可以執行任何I/O之前。

+0

你的答案真的很有幫助!因爲當我嘗試使用Google搜索這個問題時,我沒有找到任何答案(並且認爲緩存而不是緩衝區)非常感謝!感謝你,現在我可以用優雅的方式餵食那張臉;-) –

相關問題