文件操作:系统IO
文件操作
目录
- 基本概念
- Linux文件特点
- 操作方式1-系统IO
- 操作方式2-标准IO
- 两种操作模式的对比
基本概念
什么是文件
简单的说,文件就是存储在硬件磁盘上的数据集合
文件通过什么来标识?
系统中在处理的文件(读、写操作)的时候,需要唯一能够识别这个文件,就需要一个针对文件的标识,以便在其他地方能识别出这个文件,于是就产生了文件描述符
文件描述符
-
文件描述符是一些整数,简单的说就是一个文件ID,用于在系统中唯一的标识一个文件。文件描述符的总数也就是系统可以打开文件的最多个数,这取决于系统的配置情况。可打开的文件描述符总数可利用cat /proc/sys/fs/file-max来查看
-
程序在运行初,系统会默认打开3个文件描述符,分别为标准输入,输出,错误文件描述符,在<unisted.h>中有以下定义:
-
#define STDIN_FILENO 0 // 标准输入设备文件描述符
#define STDOUT_FILENO 1 // 标准输出设备文件描述符
#define STDERR_FILENO 2 // 标准错误设备文件描述符
文件类型,访问权限
-
文件类型:
普通文件(-);目录文件(d);链接文件(l);字符设备文件(c);块设备文件(b);管道文件(p);套接字文件(s);
-
访问权限:
读权限(r);写权限(w);可执行权限(x);
Liunx文件特点
- 可通过操作系统或者程序对外提供信息,也能对内输入信息,可以被创建,删除;
- 为操作系统和设备提供了一个简单而统一的接口;
- 普通程序完全可以像使用文件(普通定义)那样使用磁盘文件、串行口、打印机和其他设备;
- 硬件设备在linux操作系统中也被表示为文件。
文件操作方式1-系统调用
系统调用,由操作系统直接提供,他们是通向操作系统(内核)本身的接口,针对文件操作来说,系统调用是最直接的方式。
- int access(const char *path, int mode);
- int open(const char *path, int oflags);
- int open(const char *path, int oflags, mode_t mode );
- ssize_t read(int fd, void *buf, size_t count);
- ssize_t write(int fd, const void *buf, size_t count);
- int close(int fd);off_t lseek(int fd, off_t offset, int whence);
- int stat(const char filename, struct stat buf);
文件操作函数:
1.文件属性
函数名 | access |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> |
函数原型 | int access(const char *pathname, int mode) |
功能 | 确定文件或文件夹是否存在,访问权限 |
参数说明 | 1. pathname:要操作的文件名或路径,也可以是目录名; 注意:如果Pathname 为目录名,则mode 只能取值 F_OK,用来判断目录是否存在; 2. mode :判断模式,可取值如下: R_OK:判断文件是否有读权限 W_OK :判断文件是否有写权限 X_OK:判断文件是否有执行权限 F_OK:判断文件是否存在 |
返回值 | 如果指定的mode 方式有效,返回0,否则返回-1, 错误码放在errno |
2.打开文件
函数名 | open |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> |
函数原型 | int open(const char *pathname, int flags); int open(const char *pathname, int flags, mode_t mode ); |
功能 | 打开或创建文件 |
参数说明 | 1. pathname:要操作的文件名或路径; 2. flags:文件打开方式,可取值如下: O_RDONLY:只读 O_WRONLY: 只写 O_RDWR:读写 附加选项:O_APPEND,O_CREAT,O_TRUNC, …3.mode:如果以新建方式打开文件,这个参数用于设置文件的访问权限(详见后续) |
返回值 | 如果成功,返回文件描述符,否则返回-1,错误码放在errno |
打开文件-后续
S_IRWXU 00700 文件拥有者可读,可写,可执行
S_IRUSR 00400 文件拥有者可读S_IWUSR 00200 文件拥有者可写
S_IXUSR 00100 文件拥有者可执行
S_IRWXG 00070 组用户可读,可写,可执行
S_IRGRP 00040 组用户可读
S_IWGRP 00020 组用户可写
S_IXGRP 00010 组用户可执行
S_IRWXO 00007 其他组用户可读,可写,可执行
S_IROTH 00004 其他组用户可读
S_IWOTH 00002 其他组用户可写
S_IXOTH 00001 其他组用户可执行
3.文件读取
函数名 | read |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> |
函数原型 | ssize_t read(int fd, void *buf, size_t count); |
功能 | 从文件中读取数据 |
参数说明 | 1.fd:要操作的文件描述符; 2.buf:数据缓冲区,用来临时存放读取到的数据; 3.count:设置要读取的字节数 |
返回值 | 成功:返回实际读取到的字节数0 ;到达文件尾部,或没有可读的数据出错;返回 -1,并将错误码存入 errno 中 |
4.文件写入
函数名 | write |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> |
函数原型 | ssize_t write(int fd, const void *buf, size_t count); |
功能 | 写数据到某个文件 |
参数说明 | 1.fd:要操作的文件描述符; 2.buf:数据缓冲区,临时存放要写入的数据; 3.count:要写入的字节数 |
返回值 | 成功:返回实际写入到文件的字节数出错; 返回 -1,并将错误码存入 errno 中 |
5.关闭文件
函数名 | close |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> |
函数原型 | int close(int fd); |
功能 | 关闭已打开的文件 |
参数说明 | fd:要操作的文件描述符 |
返回值 | 成功,返回0,失败返回-1,并将错误码放入 errno |
6.文件指针移动
函数名 | lseek |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> |
函数原型 | off_t lseek(int fd, off_t offset, int whence); |
功能 | 移动文件指针 |
参数说明 | 1.fd:要操作的文件描述符; 2.offset:相对于whence 的偏移量; 3.whence:移动方式,可取以下值: SEEK_SET: 文件头部 SEEK_CUR: 当前位置 SEEK_END: 文件末尾 |
返回值 | 成功:返回文件指针的偏移量 出错:返回 -1,并将错误码存入 errno 中 |
文件映射
mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写数据到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。
7.文件映射
函数名 | mmap |
---|---|
头文件 | #include <sys/mman.h> |
函数原型 | void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *addr, size_t length); |
功能 | 映射/解除映射 文件存储空间到进程的虚拟地址空间 |
参数说明 | 1.addr:映射的地址空间首地址,NULL 表示让系统决定; 2.length:地址空间大小 3.prot:映射的地址空间访问方式,必须和文件打开方式匹配 4.flags: 映射的地址空间的访问标记 5.fd: 需映射的文件描述符 6.offset: 文件存储空间的偏移量 注:prot,flags参数相见手册 |
返回值 | 成功:munmap返回 0 ,mmap 返回映射后的地址;出错:返回 MMAP_FAILED,并将错误码存入 errno 中 |
文件状态查询
文件状态结构体stat
常用属性st_mode
8.文件状态查询
函数名 | stat |
---|---|
头文件 | #include <fcntl.h> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> |
函数原型 | int stat(const char path, struct stat buf); int fstat(int fd, struct stat *buf); |
功能 | 获取文件状态, |
参数说明 | 1.path:要操作的文件名或路径; 2.buf:指向stat 结构体的指针,用来获取文件状态信息: 3.fd:文件描述符 注:struct stat 见下页 stat 函数用来获取未打开的文件状态信息,fstat 函数用来获取打开的文件状态信息 |
返回值 | 成功:返回 0出错:返回 -1,并将错误码存入 errno 中 |
9.获取用户,组用户信息
函数名 | getpwuid |
---|---|
头文件 | #include <sys/types.h> #include <pwd.h> |
函数原型 | struct passwd* getpwuid(uid_t uid); |
功能 | 利用用户ID获取用户信息 |
参数说明 | uid:用户id |
返回值 | 成功:用户信息结构体指针 出错:返回 NULL,并将错误码存入 errno 中 |
函数名 | getgrgid |
---|---|
头文件 | #include <sys/types.h> #include <grp.h> |
函数原型 | struct group *getgrgid(gid_t gid); |
功能 | 利用用户组ID获取用户组信息 |
参数说明 | gid:用户组id |
返回值 | 成功:用户组信息结构体指针 出错:返回 NULL,并将错误码存入 errno 中 |