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操作的更多相关文章

  1. Linux文件IO操作

    来源:微信公众号「编程学习基地」 目录 文件操作 Linux文件类型 Linux文件权限 修改文件权限 Linux error 获取系统调用时的错误描述 打印错误信息 系统IO函数 open/clos ...

  2. linux文件IO操作篇 (一) 非缓冲文件

    文件IO操作分为 2 种 非缓冲文件IO 和 缓冲文件IO 它们的接口区别是 非缓冲 open() close() read() write() 缓冲 fopen() fclose() fread() ...

  3. Linux文件IO操作函数概述

    文件概述 Linux中,一切皆文件.文件为操作系统服务和设备提供了一个简单而一致的接口.这意味着程序完全可以像使用文件那样使用磁盘文件.串行口.打印机和其他设备. 也就是说,大多数情况下,你只需要使用 ...

  4. linux文件IO操作篇 (二) 缓冲文件

    2. 缓冲文件操作 //规模较大 实时性低的文件 //当数据长度快要超过缓冲区的范围时,或者时间周期达到时,数据才被送往指定位置 //需要使用FILE * 作为文件标识符 //stdin 标准输入 / ...

  5. 转:Linux 文件IO理解

    源地址http://blog.csdn.net/lonelyrains/article/details/6604851 linux文件IO操作有两套大类的操作方式:不带缓存的文件IO操作,带缓存的文件 ...

  6. Linux学习记录--文件IO操作相关系统编程

    文件IO操作相关系统编程 这里主要说两套IO操作接口,各自是: POSIX标准 read|write接口.函数定义在#include<unistd.h> ISO C标准 fread|fwr ...

  7. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  8. imx6用文件io操作gpio

    具体请参考: http://blog.csdn.net/u014213012/article/details/53140781 这里要注意的是: 要让linux支持文件io方式操作gpio,首先驱动必 ...

  9. 2.Linux文件IO编程

    2.1Linux文件IO概述 2.1.0POSIX规范 POSIX:(Portable Operating System Interface)可移植操作系统接口规范. 由IEEE制定,是为了提高UNI ...

  10. 9.2 Go 文件IO操作

    9.2 Go 文件IO操作 1.1.1. bufio包 带有缓冲区的IO读写操作,用于读写文件,以及读取键盘输入 func main() { //NewReader返回一个结构体对象指针 reader ...

随机推荐

  1. 【公众号搬运】React-Native开发鸿蒙NEXT(6)

    .markdown-body { line-height: 1.75; font-weight: 400; font-size: 16px; overflow-x: hidden; color: rg ...

  2. Ubuntu 通过 ssh 下载、上传文件

    下载文件 scp root@xxx.xxx.xxx.xxx:/root/file.txt /home 输入密码 上传文件 scp /home/file.txt root@xxx.xxx.xxx.xxx ...

  3. java-mybatis-手动分页工具类

    使用 List<PhcpSaBankAl> saBankAlList = phcpSaBankAlDao.getBankInfoList(loginUserType.getCityCode ...

  4. C/C++中的volatile

    C/C++中的volatile 约定 Volatile 这个话题,涉及到计算机科学多个领域多个层次的诸多细节.仅靠一篇博客,很难穷尽这些细节.因此,若不对讨论范围做一些约定,很容易就有诸多漏洞.到时误 ...

  5. 基于nodejs的本地文件增删改查的工具代码

    一.代码封装 这是一个使用node.js实现的对本地文件进行增删改查的工具代码封装,其中代码结尾包含了使用方法示例,具体封装代码如下: // jsonTool.js const fs = requir ...

  6. What is Good Code

    DRY:Don't repeat yourself 尽可能的不要有重复代码,同时意味着你要有足够多的抽象和思考,将相同的功能函数放在一个地方,不要重复. SRP:Single responsiblit ...

  7. 国产自研、安全、高可用——袋鼠云大数据基础平台EasyMR筑基企业数字化转型

    近年来,国际形势的风云变幻,中美双边关系的恶化,自2013年"棱镜门"事件之后,又一次警示国人,对于科技领域,只有自己掌握核心关键技术,实现自主可控,才能摆脱越来越频繁的" ...

  8. ATE测试工程师是做什么的?

    这是IC男奋斗史的第28篇原创 本文1437字,预计阅读4分钟. 前两天我们一个做封装的同事问我说,目前ATE测试工程师在就业市场上很火,很多公司都在急招,猎头也让他帮忙有偿推荐候选人.ATE测试工程 ...

  9. 你应该懂得AI大模型(十二)之 QLoRA

    一.显存和算力 1. 基本概念 显存 (Memory) 定义:GPU 用于临时存储数据的高速内存,类似于计算机的 RAM. 作用: 存储模型权重.中间激活值.梯度和优化器状态. 数据在显存与 GPU ...

  10. C# 关于WinForm 中的自带控件 chart1 竖形统计图 使用。

    百度查了好久都每找到自己想要的效果 经过一天头痛的摸索终于弄出来了,关键在于Points /// <summary>        /// 更新图像图        /// </su ...