Linux系统编程001–系统IO

1. 文件系统:用来存储、组织、管理文件的一套方式、协议

2. 文件

  • 文件的属性:i-node唯一表示一个文件的存在与否
  • 文件的内容

3. Linux系统如何实现文件的操作?

硬件层:
    inode(属性)--->文件的内容
Linux内核:
    struct inode{}用来描述一个文件的屋里inode的信息【链表保存】,系统识别到一个文件的存在,
    就会为它创建一个struct inode,一个文件只会唯一对应一个struct inode

    struct file{}用来描述一个已经打开的文件:
        文件状态标记(如:O_RDONLY、O_WRONLY......)
        文件的偏移量/offset(类似“光标”)

    struct inode*
        每一个打开的文件都会对应一个struct file
        一个文件可以被多个不同的进程打开,一个进程也可以打开多个文件

    操作文件的过程:
        struct file---> struct inode--->硬件上面的inode--->文件的内容
        linux为了屏蔽文件操作的具体细节,为每一个进程创建一个“进程文件表项”,
        保存每一个进程打开的文件的 struct file* 的数组
        struct file*fds[]
            0  struct file*--->struct inode......

            1  struct file*--->struct inode......

            ......

    linux再提供操作文件的函数接口:
        fd = open()
        打开一个指定的文件,返回“进程文件表项”的下标,
        int  "文件描述符":在linux应用中,用来描述一个已经打开的文件,每一个打开的文件都有有个唯一的id,
                            后续操作这个文件,都是通过这个id操作该文件
        read(fd)
        write(fd)
        close(fd)
        ......

    linux系统提供的这些用于操作文件的接口函数(open,read.....),我们称为“系统IO”
    系统IO:操作系统提供的对文件的输入输出的接口

4. Linux系统IO的使用

文件的操作步骤

  • 打开文件 open()
NAME
    open, openat, creat - open and possibly create a file
    打开或者创建(创建并打开)一个文件
SYNOPSIS
    #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&#xFF1A;&#x8981;&#x6253;&#x5F00;&#x6216;&#x8005;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#x540D;&#xFF0C;&#x5E26;&#x8DEF;&#x5F84;(&#x4E0D;&#x5E26;&#x8DEF;&#x5F84;&#x8868;&#x793A;&#x5F53;&#x524D;&#x8DEF;&#x5F84;)
        flags&#xFF1A;&#x6253;&#x5F00;&#x6587;&#x4EF6;&#x7684;&#x6807;&#x8BB0;
            O_RDONLY:&#x53EA;&#x8BFB;
            O_WRONLY:&#x53EA;&#x5199;
            O_RDWR:&#x8BFB;&#x5199;
            &#x4EE5;&#x4E0A;&#x4E09;&#x4E2A;&#x6807;&#x8BB0;&#x53EA;&#x80FD;&#x9009;&#x4E00;&#x4E2A;&#xFF08;&#x6587;&#x4EF6;&#x7684;&#x6253;&#x5F00;&#x65B9;&#x5F0F;&#xFF09;
            O_APPEND&#xFF1A;&#x8FFD;&#x52A0;&#x6807;&#x8BB0;&#xFF0C;&#x6253;&#x5F00;&#x6587;&#x4EF6;&#x540E;&#xFF0C;&#x6587;&#x4EF6;&#x7684;&#x504F;&#x79FB;&#x91CF;&#x4F1A;&#x5728;&#x6587;&#x4EF6;&#x7684;&#x672B;&#x5C3E;&#x3002;&#xFF08;&#x9ED8;&#x8BA4;&#x60C5;&#x51B5;&#x4E0B;&#xFF0C;&#x8BFB;&#x548C;&#x5199;&#x7684;&#x6807;&#x8BB0;&#x5728;&#x6587;&#x4EF6;&#x7684;&#x5F00;&#x5934;&#xFF09;
            O_CREAT&#xFF1A;&#x521B;&#x5EFA;&#x6807;&#x8BB0;&#xFF0C;&#x5982;&#x679C;&#x4E0D;&#x5B58;&#x5728;&#xFF0C;&#x5219;&#x521B;&#x5EFA;&#x6587;&#x4EF6;
            O_EXCL&#xFF1A;&#x8BE5;&#x6807;&#x8BB0;&#x4E00;&#x822C;&#x548C;O_CREAT&#x914D;&#x5408;&#x4F7F;&#x7528;&#xFF0C;&#x7528;&#x6765;&#x6D4B;&#x8BD5;&#x6587;&#x4EF6;&#x662F;&#x5426;&#x5B58;&#x5728;
                    &#x5982;&#x679C;&#x6307;&#x5B9A;O_CREAT | O_EXCL,&#x5E76;&#x4E14;&#x6587;&#x4EF6;&#x5B58;&#x5728;&#xFF0C;&#x5219;open&#x4F1A;&#x5931;&#x8D25;&#xFF0C;&#x5E76;&#x4E14;errno&#x8BBE;&#x7F6E;&#x4E3A;EEXIST,&#x8868;&#x793A;&#x6587;&#x4EF6;&#x5DF2;&#x5B58;&#x5728;
            O_TRUNC&#xFF1A;truncate  &#x622A;&#x77ED;&#xFF0C;&#x6E05;&#x9664;&#x6587;&#x4EF6;&#x5185;&#x5BB9;
            O_NONBLOCK&#xFF1A;&#x975E;&#x963B;&#x585E;&#x65B9;&#x5F0F;&#x6253;&#x5F00;&#x6587;&#x4EF6;
                        &#x975E;&#x963B;&#x585E;&#xFF1A;&#x4E0D;&#x7B49;&#x5F85;
                        &#x5982;&#x679C;&#x6587;&#x4EF6;&#x6CA1;&#x6709;&#x5185;&#x5BB9;&#xFF0C;read&#x4E0D;&#x4F1A;&#x7B49;&#x5F85;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x9519;&#x8BEF;
                        &#x5982;&#x679C;&#x6587;&#x4EF6;&#x6CA1;&#x6709;&#x7A7A;&#x95F4;&#x4E86;&#xFF0C;write&#x4E0D;&#x4F1A;&#x963B;&#x585E;&#xFF0C;&#x76F4;&#x63A5;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x9519;&#x8BEF;
                        &#x963B;&#x585E;&#xFF1A;&#x7B49;&#x5F85;
                        &#x5982;&#x679C;&#x6587;&#x4EF6;&#x6CA1;&#x6709;&#x5185;&#x5BB9;&#xFF0C;read&#x4F1A;&#x7B49;&#x5F85;(&#x76F4;&#x5230;&#x6709;&#x6570;&#x636E;&#x6216;&#x51FA;&#x9519;)
                        &#x5982;&#x679C;&#x6587;&#x4EF6;&#x6CA1;&#x6709;&#x7A7A;&#x95F4;&#x4E86;&#xFF0C;write&#x4F1A;&#x963B;&#x585E;&#xFF0C;(&#x76F4;&#x5230;&#x6709;&#x7A7A;&#x95F4;&#x6216;&#x51FA;&#x9519;)
                        &#x3002;&#x3002;&#x3002;&#x3002;&#x3002;&#x3002;
            &#x591A;&#x4E2A;&#x6807;&#x8BB0;&#x4F7F;&#x7528;&#x201C;|&#x201D;&#x94FE;&#x63A5;(&#x6807;&#x8BB0;&#x662F;&#x4F7F;&#x7528;&#x4F4D;&#x57DF;&#x5B9E;&#x73B0;&#x7684;)
            O_RDWR | O_CREAT | O_TRUNC
        mode:&#x6307;&#x5B9A;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#x7684;&#x6743;&#x9650;&#xFF0C;&#x5F53;&#x7B2C;&#x4E8C;&#x4E2A;&#x53C2;&#x6570;&#x5E26;&#x6709;O_CREAT&#x65F6;&#xFF0C;&#x6307;&#x5B9A;&#x521B;&#x5EFA;&#x7684;&#x6587;&#x4EF6;&#x7684;&#x6743;&#x9650;
        &#x8FD4;&#x56DE;&#x503C;&#xFF1A;&#x6210;&#x529F;&#x6253;&#x5F00;&#x4E00;&#x4E2A;&#x6587;&#x4EF6;&#xFF0C;&#x8FD4;&#x56DE;&#x6253;&#x5F00;&#x6587;&#x4EF6;&#x7684;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;&#xFF08;>2 && int&#xFF08;&#x4E0B;&#x6807;&#xFF09;&#xFF09;
              &#x64CD;&#x4F5C;&#x7CFB;&#x7EDF;&#x4F1A;&#x81EA;&#x52A8;&#x4E3A;&#x6BCF;&#x4E00;&#x4E2A;&#x8FDB;&#x7A0B;&#x6253;&#x5F00;&#x4E09;&#x4E2A;&#x6587;&#x4EF6;&#xFF1A;
              &#x6807;&#x51C6;&#x8F93;&#x5165;&#x6587;&#x4EF6;&#xFF1A;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26; STDIN_FILENO (0)
              &#x6807;&#x51C6;&#x8F93;&#x51FA;&#x6587;&#x4EF6;&#xFF1A;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26; STDOUT_FILENO (1)
              &#x6807;&#x51C6;&#x51FA;&#x9519;&#x6587;&#x4EF6;&#xFF1A;&#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26; STDERR_FILENO (2)
              &#x5931;&#x8D25;&#x8FD4;&#x56DE;-1&#xFF0C;&#x540C;&#x65F6;errno&#x88AB;&#x8BBE;&#x7F6E;
     errno&#x662F;&#x4E00;&#x4E2A;&#x5168;&#x5C40;&#x53D8;&#x91CF;&#xFF0C;&#x662F;&#x7528;&#x6765;&#x4FDD;&#x5B58;&#x6700;&#x540E;&#x4E00;&#x4E2A;&#x51FA;&#x9519;&#x7684;&#x9519;&#x8BEF;&#x7801;
         &#x5934;&#x6587;&#x4EF6;&#xFF1A; #include<srrno.h>
         &#x8DEF;&#x5F84;&#xFF1A;/usr/include/errno.h
         perror &#x628A;&#x9519;&#x8BEF;&#x7801;&#x5BF9;&#x5E94;&#x7684;&#x9519;&#x8BEF;&#x5B57;&#x7B26;&#x4E32;&#x6253;&#x5370;&#x51FA;&#x6765;
         perro("user indi");
            user indi:&#x7528;&#x6237;&#x81EA;&#x5DF1;&#x7684;&#x63D0;&#x793A;&#x4FE1;&#x606F;
            &#x6253;&#x5370;&#x51FA;&#x6765;&#x7684;&#x5F62;&#x5F0F;&#xFF1A;&#x7528;&#x6237;&#x81EA;&#x5DF1;&#x7684;&#x63D0;&#x793A;&#x4FE1;&#x606F;&#xFF1A;&#x7CFB;&#x7EDF;&#x9519;&#x8BEF;&#x7801;&#x7684;&#x63D0;&#x793A;&#x4FE1;&#x606F;
    int creat(const char *pathname, mode_t mode);</srrno.h></fcntl.h></sys></sys>
  • 对文件的操作(读、写…)
  • 关闭文件
//&#x5173;&#x95ED;&#x6587;&#x4EF6;
NAME
    close - close a file descriptor
SYNOPSIS
    #include <unistd.h>
    int close(int fd);
        close&#x662F;&#x7528;&#x6765;&#x5173;&#x95ED;fd&#x6307;&#x5B9A;&#x7684;&#x6587;&#x4EF6;
        fd:file descriptor &#x6587;&#x4EF6;&#x63CF;&#x8FF0;&#x7B26;
        &#x8FD4;&#x56DE;&#x503C;&#xFF1A;
            &#x6210;&#x529F;&#xFF1A;&#x8FD4;&#x56DE;0
            &#x5931;&#x8D25;&#xFF1A;&#x8FD4;&#x56DE;-1&#xFF0C;&#x540C;&#x65F6;errno&#x88AB;&#x8BBE;&#x7F6E;</unistd.h>

Original: https://www.cnblogs.com/emolife/p/16694090.html
Author: imagelife
Title: Linux系统编程001–系统IO

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/577804/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • ulimit: open files: cannot modify limit: Operation not permitted

    统管理员刚给授权了一台Linux 服务器访问权限,我在JumpServer 登录的时候,遇到下面错误: Last login: Wed Nov 10 13:29:30 2021 f…

    Linux 2023年5月27日
    0110
  • Identity Server 4使用OpenID Connect添加用户身份验证(三)

    一、说明 基于上一篇文章中的代码进行继续延伸,只需要小小的改动即可,不明白的地方可以先看看本人上一篇文章及源码: Identity Server 4资源拥有者密码认证控制访问API…

    Linux 2023年6月13日
    078
  • 文件批量改名(有规律)

    1.如你的文件放在桌面名字为file的文件内,我要把这些文件批量名称改为page1.jpg,page2.jpg,page3.jpg………. 2….

    Linux 2023年6月13日
    076
  • Java50个关键字之final

    1)final用于声明属性、方法和类,分别表示属性不可变、方法不可覆盖、类不可被继承(不能再派生出新的子类)。 final属性:被final修饰的变量不可变,由于不可变有两重含义,…

    Linux 2023年6月7日
    081
  • WPF 应用启动过程同时启动多个 UI 线程且访问 ContentPresenter 可能让多个 UI 线程互等

    在应用启动过程里,除了主 UI 线程之外,如果还多启动了新的 UI 线程,且此新的 UI 线程碰到 ContentPresenter 类型,那么将可能存在让新的 UI 线程和主 U…

    Linux 2023年6月6日
    082
  • 卡尔曼滤波(Kalman filter)(不完全介绍)

    1. Kalman filter基本介绍 卡尔曼滤波(Kalman filter)是一种高效的自回归滤波器,它能在存在诸多不确定性情况的组合信息中估计动态系统的状态,是一种强大的、…

    Linux 2023年6月14日
    0100
  • Prometheus+Grafana监控-基于docker-compose搭建

    前言 Prometheus Prometheus 是有 SoundCloud 开发的开源监控系统和时序数据库,基于 Go 语言开发。通过基于 HTTP 的 pull 方式采集时序数…

    Linux 2023年6月7日
    080
  • 国产化之x64平台安装银河麒麟操作系统

    背景 某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟v4,CPU使用飞腾处理器。飞腾处理器是ARMv8架构的,在之前的文章中介绍了使用QEMU模拟ARMv8架构安装银…

    Linux 2023年5月27日
    073
  • 剑指offer计划26(字符串中等)—java

    1.1、题目1 剑指 Offer 20. 表示数值的字符串 1.2、解法 这题表示直接上大佬的题解把。。。。代码太长了。有限状态自动机。对状态机一无所知的我一脸懵 1.3、代码 c…

    Linux 2023年6月11日
    089
  • 我叫Mongo,干了「查询终结篇」,值得您拥有

    这是mongo第三篇”查终结篇”,后续会连续更新5篇 mongodb的文章总结上会有一系列的文章,顺序是先学会怎么用,在学会怎么用好,戒急戒躁,循序渐进,跟…

    Linux 2023年6月14日
    0120
  • 为Linux系统添加定时备份Mysql(Docker)指定数据库的方法

    引言使用Mysql的时候遇到需要定时备份数据库的问题,但苦于Mysql自身没有提供直接的工具。 安装7z的目的主要是用于对数据库备份后的文件的压缩和加密。如果不需要也可以跳过此步骤…

    Linux 2023年6月14日
    098
  • 保姆教程系列一、Linux搭建Nacos

    前言: 请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 简介: Nacos是阿里巴巴开源的一款支持服务注册与发现,配置管理以及微服务管理的组件。用来取代以前常用的注册中心…

    Linux 2023年6月14日
    087
  • LVM讲解及磁盘挂载故障

    LVM是 Logical Volume Manager(逻辑卷管理)的简写,它是Linux环境下对磁盘分区进行管理的一种机制,使硬盘不必使用分区也能被简单地重新划分大小。首先我们先…

    Linux 2023年6月7日
    066
  • c++ 使用shell命令

    #include #include #include #include #include //execute shell command //执行&#x…

    Linux 2023年5月28日
    093
  • IOC容器模拟实现

    运用反射机制和自定义注解模拟实现IOC容器,使其具有自动加载、自动装配和根据全限定类名获取Bean的功能。 1-1 IOC容器的本质 IOC容器可理解为是一个map,其中的一个en…

    Linux 2023年6月8日
    084
  • CTF简介

    最近在学习渗透测试,后来发现CTF很有趣,发现对学习有所帮助,于是找了几个网站,下面推荐几个我觉得不错的网站 https://www.ctfhub.com/#/index http…

    Linux 2023年6月7日
    085
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球