首页 > 系统相关 >Linux文件IO操作 (系统调用函数)

Linux文件IO操作 (系统调用函数)

时间:2023-10-27 17:24:34浏览次数:31  
标签:文件 字节 int 调用函数 描述符 fd IO Linux open

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()  函数扩展文件大小

标签:文件,字节,int,调用函数,描述符,fd,IO,Linux,open
From: https://www.cnblogs.com/stux/p/17788186.html

相关文章

  • Java拾贝第十二天——IO流之转换流
    IO流还提供了一组转换流主要包括转换输出流(OutputStreamWriter)和(转换输入流InputStreamReader)。OutputStreamWriter转换输出流是Writer的子类,作用是将字节输出流转换为字符输出流。(字节......
  • 一文彻底弄懂Linux-Shell编程
    一、Shell 编程之条件结构1、Shell 条件测试语法test 测试表达式利用test命令进行条件测试表达式, test命令与测试表达式之间至少有一个空格[测试表达式]通过[]中括号进行条件测试表达式, []中括号边界与测试表达式之间至少有一个空格[[测试表达式]]通过[[]]双中括......
  • org.apache.subversion.javahl.ClientException: The working copy needs to be upgra
    eclipse不编译,每次修改代码控制台都显示错误svn:Theworkingcopyneedstobeupgradedorg.apache.subversion.javahl.ClientException:Theworkingcopyneedstobeupgradedsvn:Workingcopy‘E:\aliyun-spirit\spiritmap0916′istooold(format10,createdbySubversi......
  • 在Abp.IO 框架上面加入JWT验证
    一.安装JWT所需的NuGet包 二.在WebModule.cs下配置在这个类库中找到ConfigureAuthentication这个方法    //授权认证(使用JWT)context.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme).AddJwtBearer(o=>{......
  • #dp,二项式反演,容斥#CF285E Positions in Permutations
    题目问有多少个长度为\(n\)的排列\(P\)满足\(|P_i-i|=1\)的\(i\)的个数恰好为\(k\)个分析设\(dp_{i,j,k}\)表示前\(i\)个数钦定\(j\)个数满足上述条件且现在\(i\)和\(i+1\)因此被占用的方案数。那么第\(i\)个满足上述条件无非就是放入\(i-1\)或者\(......
  • Variational Autoencoders(VAE)
    在过去的几年中,基于深度学习的生成模型越来越受到关注,一方面这是因为该领域产生了一些惊人改进,另一方面受到关注也暗示着该领域进展迅猛。依靠大量数据,精心设计的网络体系结构和智能培训技术,深入的生成模型已经显示出了令人难以置信的能力,可以生成各种高度逼真的各种内容,例如图像......
  • paddleDection安装使用
    1,安装环境首先要安装paddlepaddle:安装方式的链接,各种显卡驱动,cuda和cudnn不多说比较基础我本身是在虚拟环境里安装的,所以虚拟环境安装也不影响它调用显卡资源查看paddle是否安装成功:>>>importpaddle>>>paddle.utils.run_check()安装paddleDection:gitclonehttps://g......
  • 基因挖掘之BSA (Bulk segregation analysis)
    目录BSA的发展BSA分析框架BSA流程及影响因素BSA的群体BSA的算法BSA的软件BSA遗传群体、算法和软件的对应关系BSA作为基因组学中基因挖掘的三板斧之一,最大优点是高效、经济、简便。通过选择双亲群体分离后代中具有极端表型的个体进行混样,然后比较不同极端混样池之间的多态性并结合表......
  • linux 更换java 版本
    1查看java版本ls/usr/lib/jvm/2设置java版本(根据提示的编号)sudoupdate-alternatives--configjava3设置环境变量sudonano/etc/environment然后添加以下内容:JAVA_HOME="/usr/lib/jvm/java-8-openjdk-amd64"PATH=$JAVA_HOME/bin:$PATH注意,JAVA_HOME需要指向您希望使......
  • 【Azure 存储服务】访问Azure Blob File遇见400-Condition Headers not support错误的
    ThisXMLfiledoesnotappeartohaveanystyleinformationassociatedwithit.Thedocumenttreeisshownbelow.问题描述在微软云存储账号的服务中,存储一些静态图片,然后通过AppService访问,但是遇见了400-conditionheadersnotsupport错误......