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搜索这个问题时,我没有找到任何答案(并且认为缓存而不是缓冲区)非常感谢!感谢你,现在我可以用优雅的方式喂食那张脸;-) –