Linux系统编程 | 文件操作

什么是系统调用

系统调用是由操作系统实现并提供给外部应用程序的编程接口(API),是应用程序和系统之间数据交互的桥梁

文件描述符

一个进程启动之后,默认打开三个文件描述符
在这里插入图片描述
说明:新打开文件返回文件描述符表中未使用的最小文件描述符,调用open函数可以打开或者创建一个文件,得到一个文件描述符

open函数

函数描述:打开或者创建一个文件

函数原型:
在这里插入图片描述

函数参数

1、pathname参数是要打开或创建的文件名,和fopen一样, pathname既可以是相对路径也可以是绝对路径

2、flags参数有一系列常数值可供选择, 可以同时选择多个常数用按位或运算符连接起来, 所以这些常数的宏定义都以O_开头,表示or

flags参数的必选项:以下三个常数中必须指定一个,且仅允许指定一个:

  • O_RDONLY 只读打开
  • O_WRONLY 只写打开
  • O_RDWR 可读可写打开

以下可选项可以同时指定0个或多个, 和必选项按位或起来作为flags参数。可选项有很多, 这里只介绍几个常用选项:

  • O_APPEND 表示追加。如果文件已有内容, 这次打开文件所写的数据附加到文件的末尾而不覆盖原来的内容
  • O_CREAT 若此文件不存在则创建它。使用此选项时需要提供第三个参数mode, 表示该文件的访问权限。(文件最终权限:mode & ~umask
  • O_EXCL 如果同时指定了O_CREAT,并且文件已存在,则出错返回
  • O_TRUNC 如果文件已存在, 将其长度截断为为0字节
  • O_NONBLOCK 对于设备文件, 以O_NONBLOCK方式打开可以做非阻塞I/O(NonblockI/O),非阻塞I/O
函数返回值
  • 成功: 返回一个最小且未被占用的文件描述符
  • 失败: 返回-1, 并设置errno
close函数

函数描述:关闭文件

函数原型:int close(int fd);

函数参数:fd文件描述符

函数返回值:

  • 成功返回0
  • 失败返回-1,并设置error值

说明:当一个进程终止时,内核会对该进程所有尚未关闭的we年描述符调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一个常年累月运动的程序(比如所网络服务器),打开一个文件描述符一定要记得关闭,否则随着打开的文件越来越多,会占用大量文件描述符和系统资源。

read函数

函数描述:从打开的设备或者文件中读取数据

函数原型:ssize_t read(int fd,void* buf,size_t count);

函数参数:

  • fd: 文件描述符
  • buf: 读到的数据保存到缓冲区buf
  • count: 缓冲区中存放的最大字节数

函数返回值:

  • >0:读取到的字节数
  • =0:文件读取完毕
  • -1:出错,并设置 error
write函数

函数描述:向打开的设备或者文件中写数据

函数原型:ssize_t write(int fd, void * buf,size_t count);

函数参数:

  • fd:文件描述符
  • buf: 缓冲区,要写入文件或设备的数据
  • count: buf中数据的长度
lseek函数

所有打开的文件都有一个当前文件偏移量,通常该偏移量是一个非负数,用于表明文件开始处在文件当前位置的字节数,读写操作通常始于当前文件的偏移量,并且读写操作会使得当前文件偏移量增大,增量为读写的字节数。==文件被打开时,当前文件的偏移量会被初始化为0,除非在打开文件时使用了参数 0_APPEND

使用lseek函数可以改变当前文件偏移量的大小:
在这里插入图片描述
函数描述:移动文件指针

函数原型: off_t lseek(int fd,off_t offset,int whence)

函数参数:

  • fd : 文件描述符
  • 参数: offset的含义取决于参数whence

1、如果whence是 SEEK_SET,文件偏移量将设置为offset

2、如果whence是 SEEK_CUR,文件偏移量将为当前文件偏移量加上offset,其中offset可以为正也可以为负

3、如果whence是 SEEK_END,文件偏移量将被设置为文件长度加上offset,其中offset可以为正也可以为负

函数返回值:若lseek函数成功执行,则返回新的偏移量

lseek函数的常用操作

  • 文件指针移动到头部: lseek(fd,0,SEEK_SET);
  • 获取文件指针当前的位置:int len = lseek(fd,0,SEEK_CUR);
  • 获取文件长度: int len = lseek(fd,0,SEEK_END);
  • lseek实现文件拓展:
    在这里插入图片描述
    代码示例:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值