【前言】
在android系统中,userspace应用常常会获取kernel中驱动的数据信息来执行一些动作:
1. CPU权限的不同,CPU可以访问的内存空间明显是不同的。
2. linux一切皆文件,userspace app获取驱动data的方式也必须通过访问VFS才可以获取。
3. linux为我们设计好了VFS,我们在上层可以访问底层各种不同文件系统的内容。
4.userspace只需要执行read/write即可执行对文件的操作。
【open】
- 不得不提VFS的advantage:不同文件系统打开方式不一样,上层只需傻傻调用open,linux对于程序猿还是很友好的,你负责用,其他我帮你搞定(够义气)。
- Open的终极奥义就是返回:文件描述符,其实就是给进程关联相应的文件,这样就可以调用
#include <unistd.h>
static inline long open(const char * name, int mode, int flags) {
return sys_open(name, mode, flags);
}
O_RDONLY 只读方式打开文件
O_WRONLY 只写方式打开文件
O_RDWR 读和写的方式打开文件
上面三个只能选择一个,下面的可以合理的任意组合:
O_CREAT 打开文件,如果文件不存在则建立文件
O_EXCL 如果已经置O_CREAT且文件存在,则强制open()失败
O_TRUNC 将文件的长度截为0
O_APPEND 强制write()从文件尾开始
对于终端文件,上面四个是无效,提供了两个新的标志:
O_NOCTTY 停止这个终端作为控制终端
O_NONBLOCK 使open()、read()、write()不被阻塞。