2016-09-06 84 views
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实际重新读取文件中的新值,而不是仅返回先前读取的值(从其“缓存??”)?

回答

3

C的标准I/O功能通常被缓冲。要禁用缓存,你可以这样做:

setvbuf(control_file, NULL, _IONBUF, 0); 

立即你打开文件后,你就可以执行任何I/O之前。

+0

你的答案真的很有帮助!因为当我尝试使用Google搜索这个问题时,我没有找到任何答案(并且认为缓存而不是缓冲区)非常感谢!感谢你,现在我可以用优雅的方式喂食那张脸;-) –

相关问题