嵌入式下qt用qsqlite数据库,会存在刷新不及时的问题解决方案

用一定的策略去执行  

            system("sync");
这个命令。这个就会立即去保存数据,,,,实际的嵌入式arm方案,我在rockchip +rk3399的方案里面。界面qt,用到了自带的qsqlite数据库,发现保存数据不及时,关机之后。重启发现数据没有更改过来。。。执行数据库更新语句之后。调用这个命令及时刷。有效果

 linux平台下的写文件刷新

c语言libc库自带的fflush和linux的sync、fsync、fdatasync,字面上都是刷新缓冲区数据到磁盘(当然,fflush还可以刷新缓冲区数据到标准输入、输出以及错误输出)。下面就分析一下上面提到的四个函数的区别。

一、c语言fflush和linux的sync、fsync、fdatasync的区别

1.接口基本不同

  • fflush是libc库中提供的函数,平台无关,只有在你使用到c语言的标准文件(FILE)操作时,才涉及fflush。
  • sync、fsync、fdatasync是系统提供的系统调,平台相关。

2.原形

  • fflush接受一个参数FILE *. fflush(FILE *);
  • sync、fsync、fdatasync的函数原型如下(fd表示文件描述符)。 sync(); fsync(int fd); fdatasync(int fd);

3.功能

  • fflush: 是把C语言FILE的缓冲区中要写入文件的内容刷到操作系统的写入缓冲区中(其实是写到内核的缓冲区,即 页高速缓存)。注意:FILE的缓冲区实际就是libc库在用户空间的栈上申请的一块内存。
  • sync、fsync、fdatasync:是把内核的缓冲区(即 页高速缓存)中要写到磁盘中的数据刷到磁盘上。 下面引用一个比较形象的流程示例: FILE缓冲-----fflush---------〉内核缓冲--------fsync-----〉磁盘

二、sync、fsync、fdatasync之间的区别

传统的UNIX系统在内核中设有页高速缓存,磁盘I/O的数据一般都通过这个缓存区。(所有增加缓存的目的显然都是协调两个速度不匹配的操作或者设备,这样就会很大程度缓解慢设备对快设备的拖累。)当我们向文件写入数据时,内核通常会先将数据复制到页告诉缓存中,然后将这些缓存页的地址排入队列,晚些时候再写入磁盘。这种方式被称为延迟写

1、sync和fsync、fdatasync的区别

  • sync只是将页高速缓存中所有修改过的块的地址排入写入队列,然后返回,他并不等待实际写磁盘操作结束。
  • fsync、fdatasync只对参数fd指定的一个文件起作用,并且等到写磁盘结束才返回。 这两个系统调用一般用于数据库这样的应用程序,这种应用需要确保修改过的块立即写到磁盘上。

2、fsync和fdatasync的区别

  • fsync不仅会讲数据写入磁盘上文件的数据(data)部分,还会将要更改的文件属性也刷到磁盘上的文件元数据(inode)部分。
  • fdatasync只影响文件的数据部分。

你可能感兴趣的:(vc,c++,QT,linux+qt)