fread isnt reading an updated value despite the file has been changed by another program

眉间皱痕 提交于 2021-01-27 16:40:06

问题


There are two programs that are working with my special file at the same time. They have a common beginning:

    #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);

But later they have a very different code

  • 1st program could change a value at TASK_POSITION offset of this file:

        /* ... 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;
    }
    
  • 2nd program is repeatedly freading a value at the same offset of this file:

        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; 
    }
    

By default, there is 0x12345678 value stored at TASK_POSITION offset.

Here is a problem:

after the 1st program has been launched and completed its' work, I could see in a hex editor that a special file has been changed successfully. However: for some unknown to me reason, fread of 2nd program keeps reading the same old value - 0x12345678 !

Although I found a temporary workaround by fclosing/fopening this file during the each iteration of 2nd program's infinite cycle (between the fread checks) it does not look like the best possible solution! Please tell: how to force fread to actually re-read a new value from a file, instead of just returning a previously read value (from its' cache??) ?


回答1:


C's standard I/O functions are typically buffered. To disable buffering, you can do:

setvbuf(control_file, NULL, _IONBUF, 0);

immediately after you open the file, before you perform any I/O on it.



来源:https://stackoverflow.com/questions/39347275/fread-isnt-reading-an-updated-value-despite-the-file-has-been-changed-by-another

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!