Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

使用 ARMLIBC fflush API 可能无法真正写入数据的问题 #4928

Closed
Tennn11 opened this issue Aug 6, 2021 · 4 comments
Closed

使用 ARMLIBC fflush API 可能无法真正写入数据的问题 #4928

Tennn11 opened this issue Aug 6, 2021 · 4 comments
Labels
discussion This PR/issue needs to be discussed later

Comments

@Tennn11
Copy link
Contributor

Tennn11 commented Aug 6, 2021

图片

如上述代码,当执行 libc 里面的 fflush API 时,底层会调用 _sys_write 函数,可是该函数只调用了 posix 的 write 函数,如果底层是 FatFS 时,此时数据并不会真正写入 flash 中。

这个问题我的考虑是不是在 write 函数下面加个 fsync 函数更好呢?

@mysterywolf mysterywolf added the bug This PR/issue is a bug in the current code. label Aug 8, 2021
@BernardXiong
Copy link
Member

write只管write的,当有文件系统存在时,则调用底层的write实现去写入 ;并是说这里需要调用fsync的,如果是bsd socket是怎么办?

@BernardXiong BernardXiong removed the bug This PR/issue is a bug in the current code. label Aug 13, 2021
@mysterywolf mysterywolf added the bug This PR/issue is a bug in the current code. label Oct 13, 2021
@mysterywolf
Copy link
Member

mysterywolf commented Nov 17, 2021

write只管write的,当有文件系统存在时,则调用底层的write实现去写入 ;并是说这里需要调用fsync的,如果是bsd socket是怎么办?

这个和socket没有关系,这个是给fread fwrite函数用的,不是unix-like函数。
但是如果改成后面加个fsync,会导致sd卡的寿命受到影响,因为fwrite每一句都会实际写入到sd卡或者其他存储介质中。

@mysterywolf mysterywolf added discussion This PR/issue needs to be discussed later v4.1.0 labels Dec 18, 2021
@mysterywolf mysterywolf removed the bug This PR/issue is a bug in the current code. label Jan 25, 2022
@mysterywolf
Copy link
Member

ARMmbed/mbed-os#1601

mysterywolf added a commit to mysterywolf/rt-thread that referenced this issue Aug 15, 2022
…e,但是目前已经被废弃。因此唯一的解决方案就是每写完一句,就调用fsync去同步一次。

该问题在mbedos社区也进行过讨论,他们也面临和我们相同的两个问题:
1. Keil-MDK无有效的fflush解决方案,mbedos依然在使用淘汰的_sys_ensure桩函数。
2. Keil-MDK没有fileno函数,我方少部分软件包因此而无法使用Keil平台编译。
参考:ARMmbed/mbed-os#1601

issue: RT-Thread#4928


经过进一步测试发现,Keil-MDK中的fflush函数已经退化成服务于STDOUT的函数,Keil-MDK内部有一个buffer可以存放fputc(stdout) 发过来的数据,如果调用fflush,这些数据是可以flush出去的。但是如果是真正的文件数据,fflush函数并没有提供任何桩函数接口可以让文件flush数据出去。
Guozhanxin pushed a commit that referenced this issue Aug 16, 2022
…e,但是目前已经被废弃。因此唯一的解决方案就是每写完一句,就调用fsync去同步一次。

该问题在mbedos社区也进行过讨论,他们也面临和我们相同的两个问题:
1. Keil-MDK无有效的fflush解决方案,mbedos依然在使用淘汰的_sys_ensure桩函数。
2. Keil-MDK没有fileno函数,我方少部分软件包因此而无法使用Keil平台编译。
参考:ARMmbed/mbed-os#1601

issue: #4928


经过进一步测试发现,Keil-MDK中的fflush函数已经退化成服务于STDOUT的函数,Keil-MDK内部有一个buffer可以存放fputc(stdout) 发过来的数据,如果调用fflush,这些数据是可以flush出去的。但是如果是真正的文件数据,fflush函数并没有提供任何桩函数接口可以让文件flush数据出去。
@mysterywolf
Copy link
Member

#6286

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
discussion This PR/issue needs to be discussed later
Projects
None yet
Development

No branches or pull requests

3 participants