图像检索服务器编写问题记录——日志定时写回

本文探讨了如何确保日志系统在服务器异常断开时能够实时写回磁盘。通过结合使用fflush与fsync方法,解决了日志丢失的问题,并介绍了实现定时写回的策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上回写的日志系统,我发现在ctrl+\使服务器突然断开后,产生的日志并没有及时地写入到磁盘文件中,磁盘中的日志还是空白的,这样无法应对服务器异常崩溃地情况。

于是在LOG类中,添加了writeback的方法。

起先writeback中只是简单的调用fclose,然后在fopen日志文件,重定位到文件尾部。【结果】:文件是空白的。

是的,fclose只是将文件在用户缓冲区的内容写入到了内核缓冲区,服务器异常崩溃无法及时将内核缓冲区的内容写回磁盘。

然后就查到了sync,fsync方法,企图通过system("sync")和fsync(fd);来将文件实时写入磁盘中。【结果】:然而文件依然是空白的。

干,这是怎么回事????问题症结:sync,fsync实际是将内核缓冲区的数据写入磁盘中。

解决之法:

先用fflush将数据从用户缓冲区中写入到内核缓冲区,然后用fsync将数据从内核缓冲区写回到磁盘。

void log_writebackfile()
{
     volatile MUTEX g(&mu);
     int fd=fileno(fp);
     fflush(fp);
     fsync(fd);
}

主循环中,可以定义一个计数器来实现定量写入;可以使用一个时钟信号来实现定时写入。准备尝试一下定时写入,顺带学习一下,信号在多线程中的使用。

12.15更

日志的定时写回:非常奢侈地开了一个线程,专门用于日志的定时写回。但因为线程本身休眠一段时间才唤醒,来将日志写回磁盘,所以一定程度上避免了空转。还能用吧?!


解决问题时其他的思考与发现:

read、write、fsync等文件IO操作的是用户缓冲区与内核缓冲区之间的数据传输+内核缓冲区与磁盘文件的数据传输。fseek等标准IO更多的操作的是用户缓冲区。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值