linux基础IO【万字详解,看不懂算我输】

目录

  • 一、重新谈论文件
  • 二、重新谈论文件操作 C
  • 三、系统文件I/O
    • 3.1 接口介绍
    • 3.2 如何理解文件
  • 四、文件描述符的分配规则
  • 五、重定向
  • 六、使用 dup2 系统调用
  • 七、理解 ---- linux一切皆文件
  • 八、FILE
  • 九、文件系统
    • 9.1 磁盘的物理结构
    • 9.2 磁盘的存储结构
    • 9.3 磁盘的逻辑结构
    • 9.4 我们的磁盘是怎么管理文件的呢?
    • 9.5 硬链接(没有独立的inode)
    • 9.6 软连接(有独立的inode)
    • 9.7 acm
  • 十、动态库和静态库
    • 10.1 静态库与动态库
    • 10.2 静态库和静态链接
      • 10.2.1 制作静态库
      • 10.2.2 链接静态库
      • 10.2.3 第二种连接第三方库的方法:直接安装到系统的库文件进行使用
    • 10.3 生成动态库
    • 10.4 动态库的加载

一、重新谈论文件

  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 }

如上,是我们之前学的文件相关操作。还有 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 }

3.1 接口介绍

  • open man open
    #include
    #include
    #include
    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 如何理解文件

linux基础IO【万字详解,看不懂算我输】_第1张图片
示例代码:

  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(

你可能感兴趣的:(linux,c++,c语言)