打开文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int open(const char* pathname,int flags);
int open(const char* pathname,int flags,mode_t mode)
-
参数
pathname
是指定打开文件的路经 -
参数flags用于设置文件打开后允许的操作方式
-
必须指定三种模式之一 解释 O_RDONLY 只读 O_WRONLY 只写 O_RDWR 读写 -
可选参数 解释 O_APPEND 对文件写操作追加到文件的尾端 O_CREATE 如果文件不存在则创建它,当选用此选项时,第三个参数mode需要同时设定 O_EXCL 用于确保此次调用是创建文件,需要与O_CREATE同时调用,当文件已经存在会返回错误 O_TRUNC 在打开文件的时候,将文件的长度截为0,需要与O_RDWR或O_WRONLY一起使用,作为新文件重新写入
-
-
参数mode只在创建文件时需要,用于指定所创建文件的权限位,同时受到umask环境变量的影响
-
这个函数正常情况下会返回一个整型的文件描述符,在出错时会返回-1。linux文件描述符策略永远选择最小可用的文件描述符
创建文件
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int creat(const char* pathname,mode_t mode);
- 等价于函数
open(pathname,O_WRONLY | O_CREATE | O_TRUNC,mode)
关闭文件
#include <unistd.h>
int close(int fd);
- close 用于关闭文件描述符
读取文件
#include <unistd.h>
ssize_t read(int fd,void* buf,size_t count);
- read尝试从fd中读取count个字节到buf中,并返回成功读取的字节数,同时将文件偏移向前移动相同的字节数。
- 读取函数有错误发生时,返回值为-1。
- 如果在读取前已经达到文件的末尾,返回0。
- read有可能读取比count小的字节数
- 读普通文件时,文件中剩余的字节数不够请求的字节数
- 当从中断设备读取数据时,其默认长度不够请求读取的数据
- 当从网络读取数据时,缓冲区大小可能小于读取请求的数据大小
写入文件
#include <unistd.h>
ssize_t write(int fd,const void* buf,size_t count);
- write尝试从buf指向的地址,写入count个字节到文件描述符fd中,并返回成功写入的字节数,同时将文件偏移向前移动相同的字节数
- 写入函数发生错误时,返回值为-1
- 写操作的返回值与想写入的的字节数会存在差异
文件偏移
- 文件的读写操作都是从当前文件的偏移处开始的。这个文件的偏移量保存在文件表中,而每一个进程都有一个文件表。那么当多个进程同时写一个文件时,即使对write进行了锁保护,在进行串行写操作时,文件依然不可避免的被写乱。
#include <sys/types.h>
#include <unistd.h>
off_t lseek(int fd, off_t offset, int whence);
-
参数whence和offset结合使用,whence表示操作模式,offset时偏移的值,offset的值可以是负值
-
whence offset SEEK_SET 相对文件开始的值 SEEK_CUR 相对文件当前位置的值 SEEK_END 相对文件结尾的值
-
-
函数lseek执行成功时返回文件的偏移量,可以用SEEK_CUR模式下偏移0的方式获得当前的偏移量,由于没有引起文件的副作用,可以用这种方式测试当前的设备是否支持lseek()函数
off_t cur_pos=lseek(fd,0,SEEK_CUR);
-
lseek函数允许返回负的偏移量,发生错误时,返回-1
文件的元数据
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
int stat(const char* path,struct stat* buf);
int fstat(int fd,struct stat* buf);
int lstat(const char* path,struct stat* buf);
-
这三个函数都可用于得到文件的基本信息,区别在于stat得到的路经path所指定的文件的基本信息,fstat得到文件描述符fd指定文件的基本信息,而lstat与stat则基本相同,只有当path是一个链接文件时,lstat得到的是链接文件自己本身信息而不是其指向文件的信息。
-
struct stat各成员含义
属性 解释 dev_t st_dev 文件所在磁盘的磁盘的ID号 ino_t st_ino 节点编号 mode_t st_mode 描述文件的类型和权限 nlink_t st_nlink 硬链接的数量 uid_t st_uid 文件属于用户的ID gid_t st_gid 文件所属用户组ID dev_t st_rdev 如果是设备文件则是设备ID号 off_t st_size 文件大小 blksize_t st_blksize 文件内容对应的块的大小 blkcnt_t st_blocks 文件内容对应得块数量 time_t st_atime 上次访问时间,访问文件的操作会改变该值 time_t st_mtime 上次修改时间 time_t st_ctime 上次状态改变的时间,对文件的读写将改变该
文件截断
#include <unistd.h>
#include <sys/types.h>
int truncate(const char* path,off_t length);
int ftruncate(int fd,off_t length);
- truncate截断的是路径path指定的文件,ftruncate截断的是fd引用的文件
- 参数length可以大于文件本身的大小,此时文件长度将变为length的大小,扩充的内容均被填充为0
- ftruncate虽然使用的是文件描述符,但不会更新当前文件的偏移量