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)

大家都在看

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