进程和打开文件之间的关系
没有打开的文件是在磁盘上的,
打开的文件是加载到内存中的。并且OS为其创建相应的数据结构struct file用来描述相关属性。
fd的使用规则,优先使用小的,每次进程运行都要默认打开0,1,2(分别是标准输入,标准输出,标准错误)
语言层面的操作都要贯穿操作系统
另外,用户层–>OS缓冲区刷新是以数据拷贝的方式,所以原来缓冲区的数据并不会消失,只是文件指针会移动而已
重定向的底层原理:
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:
文件系统(管理磁盘空间)
文件 = 文件内容 + 文件属性。
文件是放在磁盘上的,被进程打开后是加载到内存中的。
如何管理分类文件呢? 先讨论一下磁盘。
磁盘是相当大的空间,有C盘,F盘,D盘,E盘,,,,,,,,,,
但是呢对于这些硬件来说,我们只需要会管理一块空间,用相同的方法去管理所有的空间即可。
当你创建文件时操作系统都做了什么呢?
目录也是文件,目录里面存放的就是inode编号和文件名之间的链接关系。
软硬链接
软连接:本身是一个独立的文件,有自己的inode,也有自己的数据块,保存的是指向文件的所在路径和文件名。
硬链接:本能不是独立的文件,本身是链接文件的一份拷贝,和链接的文件以写时拷贝的方式共享数据。
动静态库的制作
库:本身就是.o文件(目标文件)的集合。
我们只需要向.c源文件编译生成.o文件,并提供相应的头文件和库即可
静态库的制作和使用
动态库的制作和使用