图像检索服务器编写问题记录——日志定时写回
来源:互联网 发布:日本卫星直播网络电视 编辑:程序博客网 时间:2024/04/29 07:36
上回写的日志系统,我发现在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更多的操作的是用户缓冲区。
0 0
- 图像检索服务器编写问题记录——日志定时写回
- 图像检索服务器编写问题记录——日志系统问题记录
- 图像检索服务器编写问题记录——epoll+多线程传输图片时的问题
- 图像检索服务器编写问题记录——加入信号安装后的问题
- 图像检索服务器编写问题记录——特征库的存储问题
- 图像检索服务器编写问题记录——用socket传输图片
- 图像检索服务器编写问题记录——服务器端模型选择+epoll和非阻塞IO
- 图像检索服务器编写问题记录——拒绝可恶的编译器优化
- 图像检索服务器编写问题记录——服务器端模型再思考
- 图像检索服务器编写问题记录——线程中信号的处理方式思考
- 图像检索服务器编写问题记录——添加线程池
- 图像检索服务器编写问题记录——SIFT尺度不变特征变换匹配算法学习
- 图像检索服务器编写问题记录——MSER最大稳定极值区域检测
- 图像检索服务器编写问题记录——TCP粘包了!!!
- 图像检索服务器编写问题记录——服务端的任务队列线程分配的反思
- 图像检索服务器编写问题记录——关于任务队列的思考
- 图像检索服务器编写问题记录——回忆历次版本更改
- 图像检索服务器编写问题记录——用单例模式确保log类、server类只返回一个实例
- 史上最全的maven pom.xml文件教程详解
- kafka简介和应用场景
- LeetCode 7 Reverse Integer题解
- Java 8新特性终极指南
- 关于org.mybatis.spring.MyBatisSystemException:Parameter 'userId' not found. 错误调试
- 图像检索服务器编写问题记录——日志定时写回
- Android 接收安装, 卸载,更新等系统广播
- Android 中可变参数的使用 如:int...
- 基于Flume的美团日志收集系统(一)架构和设计
- PAT (Advanced Level) Practise 1120Friend Numbers (20)
- c语言实现log日志的写入
- WdatePicker日历控件使用方法
- 图像的颜色特征,分块
- iOS高德地图之定位