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實際重新讀取文件中的新值,而不是僅返回先前讀取的值(從其「緩存??」)?
你的答案真的很有幫助!因爲當我嘗試使用Google搜索這個問題時,我沒有找到任何答案(並且認爲緩存而不是緩衝區)非常感謝!感謝你,現在我可以用優雅的方式餵食那張臉;-) –