尽管该文件已被另一个程序

时间:2016-09-06 10:54:13

标签: c file gcc fwrite 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值。

这是一个问题:

在第一个项目启动并完成其“&#39;工作,我可以在十六进制编辑器中看到特殊文件已成功更改。但是:对于一些我不知道的原因,第二个程序的fread仍然读取相同的旧值 - 0x12345678!

虽然我在第二个程序的无限循环(在fread检查之间)的每次迭代期间通过fclosing / fopening这个文件找到了一个临时的解决方法,但它看起来不是最好的解决方案!请告诉:如何强制fread实际重新读取文件中的新值,而不是只返回先前读取的值(来自其&#39;缓存??)?

1 个答案:

答案 0 :(得分:3)

C的标准I / O功能通常是缓冲的。要禁用缓冲,您可以执行以下操作:

setvbuf(control_file, NULL, _IONBUF, 0);
在您打开文件之前,

立即,然后再对其执行任何I / O.