当前位置:   article > 正文

linux基础IO【万字详解,看不懂算我输】_linux 磁盘io流程详解

linux 磁盘io流程详解

一、重新谈论文件

  1. 空文件也要在磁盘占据空间
  2. 文件 = 内容 + 属性
  3. 文件操作 = 对内容 + 对属性 or 对内容和属性
  4. 标定一个问题,必须使用:文件路径 + 文件名【唯一性】
  5. 如果没有指明对应的文件路径,默认是在当前路径进行文件访问
  6. 当我们把fopen, fclose, fread, fwrite等接口写完之后,代码编译之后,形成二进制可执行程序之后,但是没运行,文件对应的操作有没有被执行呢?没有 — 对文件的操作,本质是进程对文件的操作!
  7. 一个文件如果没有被打开,可以直接进行文件访问吗?不能!一个文件要被访问,就必须先被打开!— 用户进程 + os

所以,文件操作的本质就是进程和被打开文件的关系。

二、重新谈论文件操作 C

  1. 文件在哪里-》磁盘-》硬件-》os-》所欲哦人想要访问文件不能绕过os-》使用os提供的接口-》提供文件级别的系统调用接口-》可以,操作系统只有一个
  2. 操作 C语言
    示例代码:
  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #define FILE_NAME "log.txt"
  5 
  6 int main()
  7 {
   
  8     //以w方式单纯的打开文件,c会自动清空内部的数据
  9     FILE* fp = fopen(FILE_NAME, "a");//r,w,r+(读写,不存在出错),w+(读写,不存在创建),a(apend, 追加),a+(读+追加)               
 10     if(fp == NULL)      
 11     {
                      
 12         perror("fopen");
 13         return 1;       
 14     }                   
 15     //char buffer[64];
 16     把文件中的数据读取到buffer中                                    
 16     //while(fgets(buffer, sizeof(buffer) - 1, fp) != NULL)
 17     //{                                  
 18     //    buffer[strlen(buffer) - 1] = 0;
 19     //    puts(buffer); 
 20     //}                 
 21                         
 22     int cnt = 5;        
 23     while(cnt)          
 24     {
                                                   
 25         fprintf(fp, "%s:%d\n", "hello world", cnt--);
 26     }                   
 27                         
 28     fclose(fp);         
 29     return 0;           
 30 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

如上,是我们之前学的文件相关操作。还有 fseek ftell rewind 的函数,在C部分已经有所涉猎。

三、系统文件I/O

操作文件,除了上述C接口(当然,C++也有接口,其他语言也有),我们还可以采用系统接口来进行文件访问,先来直接以代码的形式。
示例代码:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<fcntl.h>
  7 #define FILE_NAME "log.txt"
  8 
  9 int main()
 10 {
   
 11     umask(0); 
 12     //"w" --> O_WRONLY | O_CREAT | O_TRUNC, 0666
 13     //"a" --> O_WRONLY | O_CREAT | O_APPEND, 0666
 14    int fd = open(FILE_NAME, O_RDONLY, 0666);
 15    if(fd < 0)
 16    {
   
 17        perror("open");
 18        return 1;
 19    }
 20    char buffer[1024];
 21    ssize_t num = read(fd, buffer, sizeof(buffer) - 1);
 22    if(num > 0)
 23    {
   
 24        buffer[num] = 0;
 25    }
 26    printf("%s", buffer);
 27    //int cnt = 5;
 28    //char outBuffer[64];
 29    //while(cnt)                                                                                    
 30    //{
   
 31    //    sprintf(outBuffer, "%s:%d\n", "aaaaa", cnt--);
 32    //    //你以\0作为字符串的结尾,是C语言的规定,和我文件有什么关系呢?
 33    //    write(fd, outBuffer, strlen(outBuffer));
 34    //}
 35    //printf("fd:%d\n", fd);
 36 
 37    close(fd);
 38 
 39     return 0;
 40 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44

3.1 接口介绍

  • open man open
    #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: 要打开或创建的目标文件
    flags: 打开文件时,可以传入多个参数选项,用下面的一个或者多个常量进行“或”运算,构成flags。
    参数:
    O_RDONLY: 只读打开
    O_WRONLY: 只写打开
    O_RDWR : 读,写打开
    这三个常量,必须指定一个且只能指定一个
    O_CREAT : 若文件不存在,则创建它。需要使用mode选项,来指明新文件的访问权限
    O_APPEND: 追加写
    返回值:
    成功:新打开的文件描述符
    失败:-1
    write read close lseek ,类比C文件相关接口

3.2 如何理解文件

在这里插入图片描述
示例代码:

  1 #include<stdio.h>
  2 #include<unistd.h>
  3 #include<string.h>
  4 #include<sys/types.h>
  5 #include<sys/stat.h>
  6 #include<fcntl.h>
  7 #define FILE_NAME(number) "log.txt"#number
  8 
  9 int main()
 10 {
   
 11     printf("stdin->fd:%d\n", stdin->_fileno);
 12     printf("stdout->fd:%d\n", stdout->_fileno);
 13     printf("stderr->fd:%d\n", stderr->_fileno);
 14     umask(0);
 15     int fd0 = open(FILE_NAME(1), O_WRONLY | O_CREAT | O_APPEND, 0666);                             
 16     int fd1 = open(FILE_NAME(2), O_WRONLY | O_CREAT | O_APPEND, 0666);
 17     int fd2 = open(FILE_NAME(3
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/987507
推荐阅读
相关标签
  

闽ICP备14008679号