C fread没有读取更新的值,尽管该文件已被其他程序更改

C fread没有读取更新的值,尽管该文件已被其他程序更改,c,file,gcc,fwrite,fread,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 ta

有两个程序同时处理我的特殊文件。它们有一个共同的开端:

    #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);
  • 第二个程序在该文件的同一偏移处重复读取一个值:

        /* ... 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_位置偏移处存储有0x12345678值

    这里有一个问题:

    在第一个程序启动并完成其工作后,我可以在一个十六进制编辑器中看到一个特殊文件已成功更改。然而:由于我不知道的原因,第二个程序的fread一直在读取相同的旧值-0x12345678


    虽然我在第二个程序的无限周期(fread检查之间)的每次迭代中通过关闭/打开此文件找到了一个临时解决方案,但它看起来并不是最好的解决方案!请说明:如何强制fread从文件中实际重新读取新值,而不是仅仅返回以前读取的值(从其“缓存??”)

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

    setvbuf(control_file, NULL, _IONBUF, 0);
    

    打开文件后,在对其执行任何I/O操作之前,您的回答非常有用!因为当我尝试用谷歌搜索这个问题时,我没有找到任何答案(想到的是缓存而不是缓冲区),非常感谢!多亏了你,现在我可以优雅地喂饱那张脸;-)如果您只是将缓冲区设置为通过它的前一条消息的大小或下一条消息的大小,以较大者为准,会怎么样?缓冲区的可用性通常会加快处理速度,因此我对是否放弃缓冲区的想法有点犹豫,但我也不喜欢硬编码限制,除非它们有充分的理由。@kayleeFrye_onDeck我怀疑这会有帮助;您仍然可以读取过时的缓存值。缓冲是有用的;这是一个相当罕见的情况,像这样,你会想禁用它。如果您有另一种情况,需要缓冲,但可能会读取过时的数据,那么您可能应该针对自己的情况提出一个单独的问题。@jamesdlin这是有道理的。如果您禁用它,然后立即重新启用它会怎么样?