Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统

文章目录

  • 1. 文件流指针
  • 2. 重定向
  • 3. 静态库和动态库
    • 3.1 动态库
  • 3.2 动态库配合环境变量的使用
  • 3.3 静态库的生成与使用
    • 3.4 静态库和动态库的区别
  • 4. 软硬链接
    • 4.1 软链接
    • 4.2 硬连接
  • 5. 文件系统

1. 文件流指针

FILE:typedef struct _IO_FILE FILE;
  1.FILE文件流指针是一个typedef之后的值,本质上是一个结构体
  2."/usr/include/stdio.h"
在这里插入图片描述
  struct _IO_FILE{…}
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第1张图片

  之前在进程终止的时候说的刷新缓冲区指的是C库当中维护的读写缓冲区。
  理解:_exit()函数之所以不会刷新缓冲区,是因为,_exit函数是内核代码,直接操作内核结束了进程,而此时并不会通知上层C库,所以,C库维护的缓冲区完全在无感知的情况下进程就终止了。

文件流指针和文件描述符的区别?
  1.文件流指针是一个结构体,在结构体内部保存了文件描述符
  2.文件描述符是一个正整数,其含义为fd_array数组的下标
  3.文件流指针维护了读写缓冲区

2. 重定向

  1.重定向的命令符号
    >: 清空重定向,将文件内容清空之后再重定向
    >>: 追加重定向,直接在文件的尾部进行重定向
  2.重定向的原理
    将fd_array数组当中的元素struct file*指针的指向关系进行改变,改变成为其他的struct file结构体的地址。
  3.代码重定向:
    int dup2(int oldfd, int newfd);
    dup2() makes newfd be the copy of oldfd,closing newfd first if necessary, but note the following:
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第2张图片
  4.如果必要,使用dup2进行重定向的时候,会先关闭newfd,必要:oldfd是正常的文件描述符,如果oldfd不是一个有效的文件描述符,则不关闭newfd,重定向失败,如果oldfd是一个有效的文件描述符并且和newfd是相同的文件描述符数值,则dup2什么事情都不干。
  5.将newfd拷贝old的值,一般C库函数写入文件时是全缓冲的,而写入显示器是行缓冲,printf和fwrite库函数会自带缓冲区(进度条例子就可以说明),当发生重定向到普通文件时,数据的缓冲方式由行缓冲变成了全缓冲。

3. 静态库和动态库

3.1 动态库

1.分类:
  win ==> 后缀为.dll,则为动态库
  linux ==> 后缀为.so,前缀lib,则为动态库
2.编译:
  命令: gcc/g++
  必选项的命令行参数:
    -shared:生成动态库
    -fPIC:生成与位置无关的代码
  命令范式: gcc/g++ [source code] -shared -fPIC -o lib[动态库名称].so
3.使用:
  本质上是想要使用动态库产生一个可执行程序:
  gcc/g++ [source code] -o [生成的可执行程序] -L [动态库所在的路径] -l[动态库的名称]
  -L [动态库所在路径]
  -l [动态库名称] (去除前缀lib和后缀.so之后的名字)
  ldd [可执行程序名称]:可以查看可执行程序依赖的库名称
4.代码实现:
  test.c文件
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第3张图片
  test.h文件
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第4张图片
  main.c文件
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第5张图片
命令:

gcc test.c -shared -fPIC -o libmytest.so

在这里插入图片描述
  当我们生成好了动态库,如果我们把test.c移走,执行main函数的时候,就会报错
在这里插入图片描述
正确写法:

gcc main.c -o test_main -L . -lmytest

Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第6张图片
  ldd [可执行程序名称]:可以查看可执行程序依赖的库名称
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第7张图片
  一个常见的错误:动态库文件未找到
在这里插入图片描述

3.2 动态库配合环境变量的使用

问题: 如何让我们的可执行程序能够找到依赖的动态库在哪里?
解决方案: 配合环境变量LD_LIBRARY_PATH进行使用
  1.查看动态库的搜索的环境变量
命令:

echo $LD_LIBRARY_PATH

  LD_LIBRARY_PATH:动态库的搜索的环境变量
  PATH:可执行程序搜索的环境变量
  设置环境变量:(临时生效)
命令:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/lixin/Linux/Linux-13/lib_test/test

  如果想要永久生效,则需要写到 ~/.bashrc 和 ~/.bash_profile 当中

3.3 静态库的生成与使用

1.分类
  win:后缀为.lib的文件为静态库
  linux:前缀为lib,后缀为.a的文件为静态库
2.生成静态库
Linux:

gcc -c test.c -o test.o
ar -rc libmytest.a test.o
gcc main.c -o mytest -L . -lmytest

3.步骤
  (1)先将要编译的静态库代码编译到汇编为止,意味着生成.o文件
  (2)ar -rc 生成静态库
4.使用
  使用静态库编译出来一个可执行程序
  gcc/g++ [source code] -o [生成的可执行程序] -L [静态库所在的路径] -l[静态库的名称]

3.4 静态库和动态库的区别

静态库
在这里插入图片描述
  静态库的ldd是不能看到依赖文件的,动态库是能看到依赖文件的,但是当使用ll -h的时候文件的大小是差不多的,并不能通过文件的大小来区分是动态链接还是静态链接。因此,如果可执行程序依赖静态库进行编译的成功的,会将静态库的内容直接打包到可执行程序当中,并且静态库和动态库都是通过的动态链接链接的。

ll -h

Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第8张图片
动态库
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第9张图片
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第10张图片
  1.一个程序依赖动态库或者依赖静态库生成可执行程序的时候,动态库或者静态库是不会干扰链接方式的(静态链接和动态链接)
  2.在编译可执行程序的时候,使用gcc/g++默认不增加命令行参数"-static",则为动态链接,如果增加则为“静态链接”。
  3.我们自己编译的动态库是不能静态链接的,但是操作系统编译的是可以的。

4. 软硬链接

4.1 软链接

  1.软链接就是给文件创建一个快捷方式
  2.如何创建一个软连接文件
命令: ln -s main.c test
功能: 在当前目录下创建一个test文件,test文件链接到main.c
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第11张图片  两个文件的inode节点号是不一样的,但是两个inode节点号里面的内容是一样的,软链接文件的文件属性是l。
在这里插入图片描述
  3.如果修改原文件会影响软链接文件,修改软链接文件会影响原文件。
  4.如果删除软链接文件不会影响原文件,如果删除原文件,ll之后软链接文件指向的那个文件不存在,会闪红,这时候如果vim test是可以写文件的,保存之后,会在当前目录下出现一个main.c文件。因此删除一个原文件的时候,请把软链接文件一并删除。
在这里插入图片描述

4.2 硬连接

  1.硬连接相当于文件的一个备份(拷贝)
  2.创建硬连接文件
命令: ln main.c hardtest
功能: 创建一个main.c文件的拷贝,名字为hardtest
在这里插入图片描述
  3.inode节点号一样,因为是拷贝,并且硬连接数为2,是一个普通文件。
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第12张图片
  4.如果删除原文件对硬链接文件没有影响,文件的内容还在。
在这里插入图片描述

5. 文件系统

  1.顺序存储容易造成空间的浪费
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第13张图片
  2.离散存储
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第14张图片
  3.ext2文件系统
    (1)不同的区可能有不同的文件系统,也有可能有相同的文件系统。
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第15张图片
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第16张图片
  超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一侧挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
  GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
  Block Bitmap:描述每一个块的使用情况,如果使用比特为就为1,反之为0。
  Data blocks:Data blocks和Block Bitmap配合起来,如果某个块使用了,那么  Block Bitmap所在比特位就为1
  inode Bitmap:描述inode节点的使用情况。
  inode:inode节点就是用来描述文件存储的信息,以及文件的元信息。
  inode Table:描述inode table当中哪一个inode节点被使用,哪一个没有被使用。

  4.查看磁盘的情况
    命令: df -h
    功能: 查看磁盘的情况
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第17张图片
  5.存储数据的逻辑
    (1)从block bitmap当中查找空闲的block块,将文件分成不同的块存储在不同的block当中。
    (2)从inode bitemap当中查找空闲的inode节点,将文件信息保存在inode当中,文件信息包含,文件在哪些block块当中存储,文件名称,文件大小,文件权限,文件访问时间,文件修改时间,文件修改属性时间,文件的拥有者,文件的所属组。
    (3)将文件的名称和inode节点号,作为目录项保存下来

  6.获取文件的逻辑
    (1)通过目录项当中的文件名找到对应的inode节点号
    (2)通过inode节点号,找到对应的inode节点,通过inode节点找到文件的元信息。
    (3)通过文件元信息,找到文件存储的block块,将文件内容组合起来。
    (4)展示给用户,文件的元信息以及文件的内容。

  7.
    命令: ll -i
    功能: 展示文件的信息
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第18张图片
  8.
    命令: stat main.c
    功能 更加详细的展示一个文件的文件信息
Linux-文件流指针-重定向-静态库和动态库-软硬链接-文件系统_第19张图片

你可能感兴趣的:(Linux)