[文件系统]一些问题

来源:互联网 发布:淘宝图片大小分辨率 编辑:程序博客网 时间:2024/05/17 23:41

1,如何读取一个超过4G大小的文件

在你的Makefile里面写上
CFLAGS +=  -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES
CXXFLAGS +=  -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES
其他的不用修改。这样就可以支持64位的偏移了


2,一个文件一般都是占用整数个块,为什么文件系统设计不让所有文件紧挨着存放,一个块里可以存放多个文件
答:如果一个块里可以存放多个文件,那么需要一部分数据来管理各个块内部的文件边界,这部门数据量也很大,因此基本抵消了所节省文件空间的好处。


3,sync fsync fdatasync fflush几个函数的区别
(1)sync  函数只是将所有修改过的块缓冲区排入写队列,然后就返回,它并不等待实际写磁盘操作结束。 通常称为update的系统守护进程会周期性地(一般每隔30秒)调用sync函数。这就保证了定期冲洗内核的块缓冲区。命令sync(1)也调用sync函数。
(2)fsync  函数是系统提供的系统调用。只对由文件描述符filedes指定的单一文件起作用,并且等待写磁盘操作结束,然后返回。fsync可用于数据库这样的应用程序,这种应用程序需要确保将修改过的块立即写到磁盘上。接受的时一个Int型的文件描述符。
(3)fdatasync  函数类似于fsync,但它只影响文件的数据部分。而除数据外,fsync还会同步更新文件的属性。
(4)fflush:标准I/O函数(如:fread,fwrite)会在内存建立缓冲,该函数刷新内存缓冲,将内容写入内核缓冲,要想将其写入磁盘,还需要调用fsync(先调用fflush后调用fsync,否则不起作用)。fflush接受一个参数FILE *。

4,/proc/sys/vm/dirty_ratio节点的作用
这个参数控制档系统的档系统写缓衝区的大小,单位是百分比,表示系统记忆体的百分比,表示当写缓衝使用到系统记忆体多少的时候,开始向磁片写出资料。增大之会使用更多系统记忆体用于磁片写缓衝,也可以极大提高系统的写性能。但是,当你需要持续、恒定的写入场合时,应该降低其数值,一般启动上缺省是10。设1加速程式速度

5,sync()的问题
恢复出厂设置概率不开机,只有某一家flash有问题,恢复出厂设置前先unmount userdata分区,unmount的时候会调用kill_sb 释放掉super_block,而sync()函数的调用流程是sync()————》SYSCALL_DEFINE0(sync)————》sync_filesystems()————》sync_one_sb()————》__sync_filesystem() ,发现sync()会忽略掉未mount的block device。

PC拷贝大文件到Mass storage容易出错,原因就是遇到比较慢的sdcard的时候sync花的时间比较长,而SCSI规定HOST最多等到30s。

6,linux内核中如何读写文件
点击打开链接
打开文件:filp_open()函数
strcut file* filp_open(const char* filename, int open_mode, int mode);
读写文件:vfs_read()和vfs_write函数
ssize_t vfs_read(struct file* filp, char __user* buffer, size_t len, loff_t* pos);ssize_t vfs_write(struct file* filp, const char __user* buffer, size_t len, loff_t* pos);
关闭文件:flip_close()
int filp_close(struct file*filp, fl_owner_t id);
注意的是您在使用read_file & write_file 之前需要
 //read set kernel domain set_fs(KERNEL_DS);
在read_file & write_file 完成之后,需要
 //need set user domain again set_fs(USER_DS);


7,linux删除文件的方式
当一个文件被多个进程占用的时候,当其中一个进程将文件删除,它只是将文件对应的dentry的counter减1,如果该进程发现还有其它进程占用文件,则则只在vfs_unlink() 的 d_delete() 已经将 dentry 从哈希链上移除,但是并不会释放掉当前dentry和对应的inode,所以最终会造成的结果是:已经open过当前文件的process仍然可以继续正常使用该文件,包括读写数据。只有当最后一个进程关闭打开该文件的描述符的时候,该文件对应的inode才会真正被删除。

8,mkbootfs mkbootimg mkimage工具的使用
mkbootfs ./ramdisk | gzip > ramdisk-new.gz
通过以上命令将会在ramdisk目录下生成ramdisk-new.gz压缩文件
mkimage ramdisk.img RECOVERY > ramdisk-new.gz
将ROOTFS的标记加入到ramdisk里,对于制作recovery.img以上的参数需要用RECOVERY,制作boot.img的时候以上的参数需要用ROOTFS
mkbootimage --kernel kernel --ramdisk ramdisk-new.gz --output recovery.img
通过mkbootimg工具生成recovery.img文件

9,如何查看一个进程占用的文件以及一个文件被哪些进程占用
答:lsof工具和fuser工具,或者通过proc文件系统来查看。


0 0