rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

[Bug] DFS v1 多次对同一个文件打开文件描述符,使用最后的文件描述符读取不到数据

Open liminghui12 opened this issue 6 months ago • 1 comments

RT-Thread Version

5.2.0 posix

Hardware Type/Architectures

qemu-arm

Develop Toolchain

Other

Describe the bug

问题回溯德莫

int test_dfs()
{
    FILE *fp = fopen("/test1.txt", "wb+");
    FILE *fp1 = fopen("/test1.txt", "rb+");
    if (fp)
    {
        fwrite("hello world", 1, 12, fp);
        printf("close fp %p\n", fp);
        fclose(fp);
    }
    if (fp1)
    {
        printf("close fp1 %p\n", fp1);
        fclose(fp1);
    }
    FILE *fp3 = fopen("/test1.txt", "rb+");
    if (fp3)
    {
        fseek(fp3, 0, SEEK_SET);
        char data[1024];
        memset(data, 0, 1024);
        int n = fread(&data, 1, 1024, fp3);
        printf("close fp3 %p, read:%d,%s\n", fp3, n, data);
        fclose(fp3);
    }
    return 0;
}
MSH_CMD_EXPORT(test_dfs,  "test dfs file system");`

Other additional context

No response

liminghui12 avatar Jun 13 '25 08:06 liminghui12

DFS是v1还是v2呢?Thank you.

BernardXiong avatar Jun 14 '25 09:06 BernardXiong

DFS是v1还是v2呢?Thank you.

唔,标题反而没怎么看。是v1啊。对于v1来说,多次打开同一个文件,是可能存在一些问题的。

BernardXiong avatar Jun 16 '25 13:06 BernardXiong

不太理解为啥要对同一个文件打开多次?

a1012112796 avatar Jun 17 '25 00:06 a1012112796

不太理解为啥要对同一个文件打开多次?

会有些极端情况。

然后DFS v2会修复更多这类需要考虑到更多的情况,但是DFS v2的资源占用应该会更大了。

BernardXiong avatar Jun 17 '25 14:06 BernardXiong

用的是elmfat文件系统吗?如果是的话,fat文件系统设计本身应该不考虑文件系统缓存一致性的问题。

先两次open打开同一个文件会创建两个不同fd1和fd2,对应也会创建两个不同的 FIL ,里面存了文件大小和一个独立的缓存。

通过fd1写数据,会更新对应FIL里的文件大小,数据也会写到FIL独立的缓存里,而且可能不刷到disk里。通过fd2读,fd2对应的FIL 里的文件大小还是0,而且对应的独立缓存里啥也没有,这种就读不到数据。

可能只能在用户程序避免写上面这样的代码😂

eatvector avatar Jul 03 '25 12:07 eatvector

好的,谢谢了,目前先用了dfsv2,规避这个问题

------------------ 原始邮件 ------------------ 发件人: "RT-Thread/rt-thread" @.>; 发送时间: 2025年7月3日(星期四) 晚上8:25 @.>; @.@.>; 主题: Re: [RT-Thread/rt-thread] [Bug] DFS v1 多次对同一个文件打开文件描述符,使用最后的文件描述符读取不到数据 (Issue #10393)

eatvector left a comment (RT-Thread/rt-thread#10393)

用的是elmfat文件系统吗?如果是的话,fat文件系统设计本身应该不考虑文件系统缓存一致性的问题。

先两次open打开同一个文件会创建两个不同fd1和fd2,对应也会创建两个不同的 FIL ,里面存了文件大小和一个独立的缓存。

通过fd1写数据,会更新对应FIL里的文件大小,数据也会写到FIL独立的缓存里,而且可能不刷到disk里。通过fd2读,fd2对应的FIL 里的文件大小还是0,而且对应的独立缓存里啥也没有,这种就读不到数据。

可能只能在用户程序避免写上面这样的代码😂

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you authored the thread.Message ID: @.***>

liminghui12 avatar Jul 07 '25 06:07 liminghui12