尽管文件已被另一个程序更改,但 fread 没有读取更新的值
fread isnt reading an updated value despite the file has been changed by another program
有两个程序同时处理我的特殊文件。他们有一个共同的开始:
#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;
}
默认情况下,0x12345678 值存储在 TASK_POSITION 偏移处。
这里有个问题:
在第一个程序启动并完成其工作后,我可以在十六进制编辑器中看到一个特殊文件已成功更改。但是:由于某些我不知道的原因,第二个程序的恐惧一直在读取相同的旧值 - 0x12345678 !
虽然我在第二个程序的无限循环(在 fread 检查之间)的每次迭代期间通过 fclosing/fopening 这个文件找到了一个临时解决方法,但它看起来不像是最好的解决方案!请告诉:如何强制 fread 从文件中实际重新读取一个新值,而不是仅仅返回一个以前读取的值(从它的缓存中??)?
C 的标准 I/O 函数通常是缓冲的。要禁用缓冲,您可以这样做:
setvbuf(control_file, NULL, _IONBUF, 0);
打开文件后立即,在对其执行任何 I/O 之前。
有两个程序同时处理我的特殊文件。他们有一个共同的开始:
#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; }
默认情况下,0x12345678 值存储在 TASK_POSITION 偏移处。
这里有个问题:
在第一个程序启动并完成其工作后,我可以在十六进制编辑器中看到一个特殊文件已成功更改。但是:由于某些我不知道的原因,第二个程序的恐惧一直在读取相同的旧值 - 0x12345678 !
虽然我在第二个程序的无限循环(在 fread 检查之间)的每次迭代期间通过 fclosing/fopening 这个文件找到了一个临时解决方法,但它看起来不像是最好的解决方案!请告诉:如何强制 fread 从文件中实际重新读取一个新值,而不是仅仅返回一个以前读取的值(从它的缓存中??)?
C 的标准 I/O 函数通常是缓冲的。要禁用缓冲,您可以这样做:
setvbuf(control_file, NULL, _IONBUF, 0);
打开文件后立即,在对其执行任何 I/O 之前。