linux C 文件相关函数

打开文件

#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的值可以是负值

    • whenceoffset
      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虽然使用的是文件描述符,但不会更新当前文件的偏移量
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值