Linux的I/O操作

文章目录

    • 进程和打开文件之间的关系
    • 语言层面的操作都要贯穿操作系统
    • 文件系统(管理磁盘空间)
    • 软硬链接
    • 动静态库的制作

进程和打开文件之间的关系

没有打开的文件是在磁盘上的,
打开的文件是加载到内存中的。并且OS为其创建相应的数据结构struct file用来描述相关属性。
Linux的I/O操作_第1张图片

fd的使用规则,优先使用小的,每次进程运行都要默认打开0,1,2(分别是标准输入,标准输出,标准错误)

语言层面的操作都要贯穿操作系统

Linux的I/O操作_第2张图片

另外,用户层–>OS缓冲区刷新是以数据拷贝的方式,所以原来缓冲区的数据并不会消失,只是文件指针会移动而已

重定向的底层原理:
Linux的I/O操作_第3张图片

int main()
 11 {
 12     int fd = open("log.txt",O_CREAT | O_WRONLY,0664);
 13     dup2(fd,1);
 14     printf("hello chen\n");
 15     printf("hello chen\n");
 16     printf("hello chen\n");
 17     printf("hello chen\n");
 18 
 19     write(fd,"hahahahahahaah\n",25);
 20     write(1,"xxxxxxxxxxxxx\n",25);                                                                                                           
 21                                                                                                                                    
 22     return 0;
 23 }  

解释神奇的现象
现象1:

关闭标准输出,fd占用1,也就是说printf应该向文件log.txt写入,但是我们发现log.txt中并没有内容,原因就是
由向显示器输出改为向普通文件中输出,行缓冲变为全缓冲,即进程退出才会刷新,而进程还没有退出的时候,
就关闭了fd,找不到文件内核缓冲区了。

10 int main()
 11 {
 12     close(1);
 13     int fd = open("./log.txt",O_WRONLY | O_CREAT,0644);
 14     if(fd < 0)
 15     {
 16       printf("error\n");
 17       exit(-1);
 18     }
 19 
 20     printf("hello chen\n");
 21     printf("hello chen\n");
 22     printf("hello chen\n");
 23     printf("hello chen\n");
 24     printf("hello chen\n");
 25     printf("hello chen\n");
 26     close(fd);                                                                                                                               
 27 
 28     return 0;
 29 }
 30 

现象2:
Linux的I/O操作_第4张图片
Linux的I/O操作_第5张图片

文件系统(管理磁盘空间)

文件 = 文件内容 + 文件属性。
文件是放在磁盘上的,被进程打开后是加载到内存中的。
如何管理分类文件呢? 先讨论一下磁盘。
磁盘是相当大的空间,有C盘,F盘,D盘,E盘,,,,,,,,,,
但是呢对于这些硬件来说,我们只需要会管理一块空间,用相同的方法去管理所有的空间即可。
Linux的I/O操作_第6张图片

当你创建文件时操作系统都做了什么呢?
目录也是文件,目录里面存放的就是inode编号和文件名之间的链接关系。
Linux的I/O操作_第7张图片

软硬链接

软连接:本身是一个独立的文件,有自己的inode,也有自己的数据块,保存的是指向文件的所在路径和文件名。
硬链接:本能不是独立的文件,本身是链接文件的一份拷贝,和链接的文件以写时拷贝的方式共享数据。
Linux的I/O操作_第8张图片

动静态库的制作

库:本身就是.o文件(目标文件)的集合。
我们只需要向.c源文件编译生成.o文件,并提供相应的头文件和库即可
Linux的I/O操作_第9张图片

静态库的制作和使用
Linux的I/O操作_第10张图片
动态库的制作和使用
Linux的I/O操作_第11张图片

你可能感兴趣的:(Linux,linux)