Linux文件操作---随手记
来源:互联网 发布:数据库原理与应用的ppt 编辑:程序博客网 时间:2024/05/24 07:05
文件定义
狭义
磁盘文件,进而可以是有组织有次序地存储在任何介质(包括内存)中的一组信息
广义
凡是可以产生或者消耗信息的都是文件。(也包括socket)
文件操作方式
系统调用:linux system call 类似windows 的api,为linux特有的系统操作,其中有关文件的操作有:pen, read, write, close, lseek, ioctl, 等
库函数:库函数是编程语言提供的函数集合,比如C的标准输入输出库:stdio.h 提供了以下函数fopen, fread, fwrite, fclose, fflush fseek, etc.
,这些函数不局限于linux操作系统,其他支持该C标准库的操作系统同样可以使用。
在linux 中,库函数对文件的操作实际是对系统调用的相关操作的封装。
创建
打开
系统调用
int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode);
例子
open(“test”, O_CREAT, 10705)open(“test”, O_CREAT, S_IRWXU | S_IROTH | S_IXOTH | S_ISUID)
C库函数
FILE *fopen(const char *path, const char *mode);
读写
系统调用
int read(int fd, const void *buf, size_t length);
从文件描述符fd指定的文件中读取length个字节到buf缓冲区
int write(int fd, const void *buf, size_t length);
把length个字节从buf缓冲区写入到文件描述符fd指向的文件中
C库函数
int fgetc(FILE *stream);int fputc(int c, FILE *stream);char *fgets(char *s, int n, FILE *stream);int fputs(const char *s, FILE *stream);int fprintf(FILE *stream, const char *format, ...);int fscanf (FILE *stream, const char *format, ...);Size_t fread(void *ptr, size_t size, size_t n, FILE *stream);Size_t fwrite (const void *ptr, size_t size, size_t n, FILE *stream);
定位
系统调用
int lseek(int fd, offset_t offset, int whence);
作用,移动当前读写位置,offset含义取决于whence。
返回值:新的偏移量(成功),-1(失败)
技巧:currpos = lseek(fd, 0, SEEK_CUR) 返回当前的文件偏移量
C库函数
int fgetpos(FILE *stream, fpos_t *pos);int fsetpos(FILE *stream, const fpos_t *pos);int fseek(FILE *stream, long offset, int whence);
关闭
示例——文本复制
系统调用
#include <unistd.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> int main() { char c = '\0'; int in = -1, out = -1; in = open("Data.txt", O_RDONLY); out = open("copy_system.out.txt", O_WRONLY|O_CREAT, S_IRUSR|S_IWUSR); while(read(in, &c, 1) == 1) { write(out, &c, 1); } close(in); close(out); return 0; }
C库函数
#include <stdio.h> #include <stdlib.h> int main() { int c = 0; FILE *pfin = NULL; FILE *pfout = NULL; pfin = fopen("Data.txt", "r"); pfout = fopen("copy_stdio.out.txt", "w"); while(fread(&c, sizeof(char), 1, pfin)){ fwrite(&c, sizeof(char), 1, pfout);} fclose(pfin); fclose(pfout); return 0; }
区别
文件层次
底层上,linux文件系统包括Ext2,等。
向上,则为用户程序提供一个统一的,抽象的,虚拟的文件系统界面。也就是所谓的虚拟文件系统-VFS(virtual filesystem ),虚拟文件系统为用户程序提供了一组标准的,抽象的文件操作——read ,write,lseek 等。也就是我们所谓的 系统调用。(文件操作包括 系统调用和库函数)
图1
系统调用open是如何调用驱动的open的
注册字符设备
file_operations misc_fops = { .open= misc_open};
register_chrdev(MISC_MAJOR,”misc”,&misc_fops)
图2
系统调用open
图3
进程中文件操作的结构
图4
Android中的文件系统
Init.rc中的文件分区与文件属性
挂载ROM分区到 /system;/data;/cache 分区:
mount ext4 /dev/block/mmcblk0p9 /system ro wait noatimemount ext4 /dev/block/mmcblk0p12 /data wait nosuid nodev noatime discardmount ext4 /dev/block/mmcblk0p8 /cache nosuid nodev noatime journal_async_commit
noatime:Linux缺省每次读文件,都要更新这个文件的last access time属性,增加这个noatime选项,则在读文件时不去更改文件的access time属性了,提高文件系统性能
文件属性简介
Linux文件可以分为如普通文件、目录、符号链接文件、字符和块设备文件、套接口文件等。
Umask-代表“剥夺”的权限
Mode 的助记表示法
-R参数循环设置目录下的所有文件及目录
setuid和setgid 位-setuid 和 setgid “ ” 是让程序执行的时候 临时的 的拥有了程序
文件所有者的 uid 和 gid,等程序执行完后再恢复到发起者的权限。
对于目录,如果在某个目录上设置了 setgid 位以后,在这个目录中创建的文件具有该目录的属组权限而不是创建该文件的用户的默认属组
Sticky粘贴位(较少用到)-一个目录即使它的所有权限都开放rwxrwxrwx,如果是设置了粘帖位,除非目录的属主和root用户有权限删除它,除此之外其它用户不能删除这个目录,用途一般是把一个文件夹的的权限都打开,然后来共享文件,象/tmp目录一样。
Android文件系统的初始权限
tmpfs文件系统类型是基于虚拟内存的文件系统
rootfs,也是一种基于RAM的文件系统,可以看到Android的/是直接建立在RAM上的
android/system/core/include/private/android_filesystem_config.h
定义了各个用户及用户组,并定义了部分目录的用户,用户组,读写权限
Android 系统编译时会使用两个 Android 命令 mkbootfs 和 mkyaffs2image 来生成这些 img文件,这两个命令都会调用文件 android_filesystem_config.h 中预制的权限,来写入这些目录和文件资源初始的访问权限
#define AID_ROOT 0#define AID_SYSTEM 1000#define AID_RADIO 1001…………………………
static struct fs_path_config android_dirs[] = { { 00770, AID_SYSTEM, AID_CACHE, "cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/app" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/app-private" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/dalvik-cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, "data/data" }, //可以在此处添加新增目录的权限
分别对应:Mode uid gid *prefix
static const struct android_id_info android_ids[] = { { "root", AID_ROOT, }, { "system", AID_SYSTEM, }, { "radio", AID_RADIO, }, …………………………
分别对应Name和aid
static struct fs_path_config android_files[] = { { 00440, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.rc" }, { 00550, AID_ROOT, AID_SHELL, "system/etc/init.goldfish.sh" }, { 00440, AID_ROOT, AID_SHELL, "system/etc/init.trout.rc" }, { 00550, AID_ROOT, AID_SHELL, "system/etc/init.ril" }, //可以在此处添加新增文件的权限
分别对应:Mode uid gid *prefix
新增设备权限
android/system/core/rootdir/ueventd.rc
/dev/null 0666 root root/dev/zero 0666 root root/dev/full 0666 root root/dev/ptmx 0666 root root/dev/tty 0666 root root/dev/random 0666 root root/dev/urandom 0666 root root/dev/ashmem 0666 root root/dev/binder 0666 root root新增设备时在此文件中添加权限
对于新添加的设备,需要在该文件中添加对应的设备权限,否则可能出现无法使用的情况。
- Linux文件操作---随手记
- 实习随手记-文件系列操作
- Linux学习随手记(4) 设备文件
- 随手笔记-VS文件操作
- 实习随手记-文件操作(windows函数)
- 随手记-嵌入式linux
- Linux 随手记1
- Linux随手记
- linux命令随手记
- 随手记一下文件读写
- 随手记,linux各种命令
- 实习随手记-win32创建窗口操作
- 实习随手记-win32进程操作
- android 随手记 读取文件-拿到流
- [随手记]Android 读取文件-拿到流
- Linux学习随手记(3) 组管理
- Linux学习随手记(2) 用户管理
- linux驱动开发随手记【1】
- JavaScript闭包详解
- SignalR,Angular JS 以及 ASP.NET MVC 实时通信
- 禁用系统键盘
- iscsi服务配置及使用
- 深入解析python版SVM源码系列(一)——添加数据库和绘制效果图
- Linux文件操作---随手记
- android.app.ANRAppManager.dumpMessageHistory记录
- awk
- 结构体中得函数指针,让我们更加方便~
- Quartz配置1.6&2.2
- hadoop学习(一)------------搭建单机本地运行环境
- 备考等级C++
- canvas背景填充、缩放、变换、文本
- Android MIC 口的音频采集