BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #101631同步于 2022/1/16
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请问C语言标准IO采取全缓冲的话,如何保证系统崩溃时数据不丢失

shaojunying
2022/1/16镜像同步10 回复
rt,在《Unix环境高级编程》5.4缓冲 中看到C标准IO库的文件读写采用全缓冲。“全缓冲。在这种情况下,在填满标准I/O缓冲区后才进行实际I/O操作。”那么如何才能保证系统崩溃时数据不丢失?
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
baymaxhwy机器人#1 · 2022/1/16
有一些系统调用,比如fsync可以解决
irvingwangjr机器人#2 · 2022/1/16
系统只要保证从缓冲区拷贝到用户态内存前不给用户态程序返回success 就好了吧,剩下情况一律给error
specops机器人#3 · 2022/1/16
保证不了,比如 printf("hello\nworld");int i=*(int*)0; 这段代码在我的 Linux 机器上只会输出 hello ,所以如果要避免缓冲区的内容没有及时同步需要手动刷新缓冲区,但刷新的过程中 OS 也可能挂掉 (I use Arch Linux by the way)
shaojunying机器人#4 · 2022/1/16
但是感觉这种数据丢失对于任意应用都是不可接受的吧 那难道每次write都要调用flush吗 【 在 specops 的大作中提到: 】 : 保证不了,比如 printf("hello\nworld");int i=*(int*)0; 这段代码在我的 Linux 机器上只会输出 hello ,所以如果要避免缓冲区的内容没有及时同步需要手动刷新缓冲区,但刷新的过程中 OS 也可能挂掉 : (I use Arch Linux by the way) : ............
specops机器人#5 · 2022/1/16
看应用类型吧,比如 wget 就不会,但数据库会 【 在 shaojunying 的大作中提到: 】 : 但是感觉这种数据丢失对于任意应用都是不可接受的吧 那难道每次write都要调用flush吗
shaojunying机器人#6 · 2022/1/16
好的 明白了 感谢[bbsemoji55357,56911] 【 在 specops 的大作中提到: 】 : 看应用类型吧,比如 wget 就不会,但数据库会
specops机器人#7 · 2022/1/16
【 在 shaojunying 的大作中提到: 】 : 好的 明白了 感谢[bbsemoji55357,56911]
KatyuMarisa机器人#8 · 2022/1/16
看你需不需要应对断电(或者其他导致内核炸掉的场景),如果需要的话就fsync,但大部分场景是不需要的,只要内核不崩那么内核就会为你已经提交到缓冲区的数据做收尾工作
shaojunying机器人#9 · 2022/1/16
【 在 KatyuMarisa 的大作中提到: 】 : 看你需不需要应对断电(或者其他导致内核炸掉的场景),如果需要的话就fsync,但大部分场景是不需要的,只要内核不崩那么内核就会为你已经提交到缓冲区的数据做收尾工作 好的 明白了 非常感谢