Linux 文件IO操作
1.打开和关闭文件
1.1 open
#include<unistd.h>
#include<fcntl.h>
int open(const char *pathname, int flags)
/*
pathname: 打开文件的路径名(相对、绝对)
flags: 打开文件的方式(O_RDONLY | O_WRONLY | O_RDWR) --- <fcntl.h>
return: 返回一个文件描述符或-1
*/
int open(const char* pathname, int flags, mode_t mode)
/*
pathname: 打开文件的相对路径
flags: 打开文件的方式(O_RDONLY|O_WRONLY|O_RDWR)
还有很多标签可以在man里查看
mode_t: 参数2如果指定了 O_CREAT, 则参数三传 8 进制数来描述文件权限
例如 0664表示 rw-rw-r--
*/
注意,文件创建后的最终权限受到 open() 函数传入的参数影响,同时也受到 umask 屏蔽掩码共同影响
最终创建出的文件权限 = mode & (~umask)
1.2 close
#include <unistd.h>
int close(int fd)
/*
fd: open的返回值(文件描述符)
return: 成功0, 失败-1, errno
*/
2.文件读取和写入
read和write都是按字节操作的函数
2.1 read
ssize_t read(int fd, void *buf, size_t count)
/*
fd: 打开的文件描述符
buf: 读取数据到缓冲区
count: 缓冲区大小 size_t: 无符号整数 ssize_t 有符号整数 return:
成功: 读到文件末尾0,
未读到文件末尾>0
失败: -1
errno = EAGAIN(或EWOULDBLOCK): 非阻塞状态读(网络、设备)文件没读到数据
errno != EAGAIN(或EWOULDBLOCK): 错误
*/
2.2 write
ssize_t write(int fd, void *buf, size_t count)
/*
fd: 打开的文件描述符
buf: 储存写出数据的缓冲区地址
count: 缓冲区大小 size_t: 无符号整数 ssize_t 有符号整数
return:
成功: >0 写入的数据大小, =0 没有写入数据
失败: -1, errno
*/
2.3 与fgetc和fputc比较
read 和 write 是系统调用,fgetc 和 fputc 是 c 语言提供的函数。下面两个函数举例,同样复制一个txt文件,每次复制一个字节,c 语言提供的函数速度会远远快于系统调用,因为 c 语言封装的 read 和write 有一个缓冲区,分别是预读入和缓输出,虽然 fgetc 函数读取一个字节,但实际上它一次性会缓存4096字节在内存中,同样 fputc 虽然会写入一个字节,但它会先写入内存4096字节再一次性写入文件,这种机制避免了频繁IO降低性能
2.4 文件描述符
PCB进程控制块里有一个成员是文件描述符表,open 函数返回的 fd 是一个下标,返回表中未被使用的最小的文件描述符(0、1、2分别是标准输入STDIN_FILENO、标准输出STDOUT_FILENO、标准出错STDERR_FILENO)
3. 错误代码处理
3.1 strerror
char* strerror(EINTR); // 头文件<string.h>,引入errno.h头文件(错误号), 该函数会打印错误号对应的信息(EINTR其实是4)
3.2 perror
int fd = open(filepath, O_RDWR|O_CREAT|O_TRUNC, 0644);
if(fd == -1)
{
perror("open dst err"); // 打印该字符串以及errno错误号对应的错误信息
exit(1); // 程序非正常退出
}
4.改变已经打开文件的访问属性
4.1 fcntl (f control)
这个函数功能非常多,这只是一个例子
#include <fcntl.h>
int fcntl(int fd, int cmd, ...);
// 获取文件权限
int flag = fcntl(fd, F_GETFL);
// 修改文件权限
flag |= O_NONBLOCK; // 例如添加非阻塞权限
// 设置文件权限
fcntl(fd, F_SETFL, flag);
5.改变文件指针
5.1 lseek
off_t lseek(int fd, off_t offset, int whence);
/*
fd: 文件描述符
offset: 偏移量
whence: 起始偏移位置 SEEK_SET起始位置 / SEEK_CUR当前位置 / SEEK_END结束位置 return: 成功返回起始位置的偏移, 失败返回-1
*/
- 文件的“读”、“写”使用相同偏移位置,所以先使用 write 写入10个字节后,read 时指针也是在第10个字节开始的,这可能就需要 lseek 调整指针位置
- 可以通过 int len = lseek(fd, 0, SEEK_END); 获取当前文件的大小,从结束位置偏移 0 个字节返回
- 可以通过 int len = lseek(fd, 10, SEEK_END); 拓展文件大小,但必须引起IO操作才能拓展,write(fd, "a", strlen("a")); 正常应该用 truncate() 函数扩展文件大小
Linux 文件IO操作的更多相关文章
- Linux文件IO操作
来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...
- linux文件IO操作篇 (一) 非缓冲文件
文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...
- Linux文件IO操作函数概述
文件概述 Linux中,一切皆文件.文件为操作系统服务和设备提供了一个简单而一致的接口.这意味着程序完全可以像使用文件那样使用磁盘文件.串行口.打印机和其他设备. 也就是说,大多数情况下,你只需要使用 ...
- linux文件IO操作篇 (二) 缓冲文件
2. 缓冲文件操作 //规模较大 实时性低的文件 //当数据长度快要超过缓冲区的范围时,或者时间周期达到时,数据才被送往指定位置 //需要使用FILE * 作为文件标识符 //stdin 标准输入 / ...
- 转:Linux 文件IO理解
源地址http://blog.csdn.net/lonelyrains/article/details/6604851 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件 ...
- Linux学习记录--文件IO操作相关系统编程
文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...
- 树莓派学习笔记——使用文件IO操作GPIO SysFs方式
0 前言 本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...
- imx6用文件io操作gpio
具体请参考: http://blog.csdn.net/u014213012/article/details/53140781 这里要注意的是: 要让linux支持文件io方式操作gpio,首先驱动必 ...
- 2.Linux文件IO编程
2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...
- 9.2 Go 文件IO操作
9.2 Go 文件IO操作 1.1.1. bufio包 带有缓冲区的IO读写操作,用于读写文件,以及读取键盘输入 func main() { //NewReader返回一个结构体对象指针 reader ...
随机推荐
- C#中无法将文件”obj\debug\XXX.dll复制到“bin\Debug\XXX.dll” 拒绝访问
较为方便有效的方法就是,把项目属性中的"应用程序集"的"程序集名称"修改为另一个名称即可.
- centos 7 安装 netcoresdk 和Nginx 并发布netcore
微软官网的yum安装: 打开linux终端程序 netcore sdk 地址https://dotnet.microsoft.com/download/linux-package-manager/ce ...
- git提示:There is no tracking information for the current branch
问题 使用git pull拉取远程分支代码的时候,提示: > There is no tracking information for the current branch. Please sp ...
- 宝塔面板部署java springboot项目
前言 1.此文章用的是腾讯云的云服务器,2H4G,centos7.6,宝塔面板7.9.0 2.安装好宝塔面板,这一过程就不说了,懂得都懂 3.以下准备工作仅为MyAuth需要,如果您的springbo ...
- 题解:AT_cf16_exhibition_final_e Water Distribution
题目链接:link. 这道题目我们有 \(3\) 个结论: 在最优情况下,最后所有的点上的水量都是一样的.因为水多的可以向水少的运水. 不存在间接运水的情况,这个由三角形的三边关系可以得到. 最优运输 ...
- Jenkinsfile_配置定时任务
triggers 在jenkinsfile来定义流水线时,常规情况下,项目都是基于手动点击部署,这种策略尤其适用于线上环境,但在测试环境,乃至于预发环境,应该对自动构建有更高的集成度,使开发者只关注于 ...
- Golang基础笔记一之变量声明和类型介绍
本文首发于公众号:Hunter后端 原文链接:Golang基础笔记一之变量声明和类型介绍 这一篇笔记主要介绍 Golang 的基础内容,包括 Golang 的运行,变量声明以及 Golang 里的各种 ...
- 数栈产品分享:基于StreamWorks构建实时大数据处理平台
数栈是云原生-站式数据中台PaaS,我们在github和gitee上有一个有趣的开源项目:FlinkX,FlinkX是一个基于Flink的批流统一的数据同步工具,既可以采集静态的数据,也可以采集实时变 ...
- 破解五大运营痛点:盘古信息IMS MOM重塑PCB工厂数字化基石
随着5G.物联网等技术发展,PCB行业下游消费电子.汽车电子等领域需求呈现小批量多品种.高精度高可靠性.快速交付特点.传统"规模驱动"生产模式难以适应新需求,行业竞争焦点转向质量. ...
- 线程CompletableFuture简单使用 记录一下
CompletableFuture.runAsync(() -> { //代码块 }); //可以选择线程执行后的结果去判断下一步的执行,具体使用百度自查