【Linux】文件描述符1
文章目录
- 一、简单回顾
- 二、C系列文件接口
- 什么是当前路径?
- 三、直接采用系统接口
- 四、分析系统接口及其细节,引入fd
- 五、周边文件()
- 缓冲区
- stdout和stderr
一、简单回顾
- 文件 = 文件内容 + 属性
- 文件所有操作无非对内容或属性的操作
- 打开的文件:文件在磁盘上放着,我们访问文件的流程是:写代码 -> 编译 -> exe -> 运行 -> 访问文件;其本质就是进程在访问文件
- 没打开的文件:在哪里放着呢?在磁盘上放着。我们最关注什么问题?没有被打开的文件非常多。文件如何被分门别类的放置好—即我们要快速的进行增删查改—即快速的找到文件;
所以上面的问题总结下来就是如何存储? - 一个文件被打开,必须先被加载到内存中!
- 进程 : 打开的文件 = 1:n(即一个进程可以打开任意个文件)
由以上两点我们可以得到:操作系统内部,一定存在大量的被打开的文件! ----OS要不要管理这些被打开的文件呢? —肯定是要的,那么怎么管理呢?----先描述,在组织 ---- 所以在内核中,一个被打开的文件都必须有自己的文件打开对象,包含文件的很多属性。struct XXX {文件属性; struct XXX* next};
- 显示器是硬件吗?本质和磁盘一样
- Linux下一切皆文件
狭义文件:磁盘上的文件
广义文件:显示器、键盘、声卡、显卡、磁盘、几乎所有外设
二、C系列文件接口
什么是当前路径?
#include <stdio.h>
int main()
{
FILE* fp = fopen("log.txt","w");
if(fp == NULL)
{
perror("fopen");
return 1;
}
fclose(fp);
return 0;
}
执行结果:
注意这里的打开文件的路径和文件名,默认在当前路径下新建一个文件。
那么这里当前路径是什么呢?其实是进程的当前路径cwd
当一个进程运行起来的时候,每个进程都会记录自己当前所处的路径
如上图输出重定向
三、直接采用系统接口
再看系统接口open
接下来,我们对它进行使用:
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5
6 int main()
7 {
8 int fd = open("log.txt",O_RDONLY);
9 if(fd < 0)
10 {
11 perror("open");
12 return -1;
13 }
14
15 //success
16 printf("success\n");
17 return 0;
18 }
打开失败
对代码进行改变:
1 #include <stdio.h>
2 #include <sys/types.h>
3 #include <sys/stat.h>
4 #include <fcntl.h>
5
6 int main()
7 {
8 int fd = open("log.txt",O_RDONLY | O_CREAT);
9 if(fd < 0)
10 {
11 perror("open");
12 return -1;
13 }
14
15 //success
16 printf("success\n");
17 return 0;
18 }
但我们发现
该文件的权限和平常创建文件的权限不一样;这里与umask有关;
既然文件打开了,那肯定是要关闭的,来看close:
这里很好的说明了一切接文件
四、分析系统接口及其细节,引入fd
五、周边文件()
FILE结构体里面,必定封装了fd;
所以fd是什么?
进程要访问文件,必须打开文件!
一个进程可以打开多个文件吗·?
一般而言 进程:打开的文件 = 1 : n;
文件要被访问,前提是加载到内存中,才能直接被访问!
如果多个进程都打开多个文件,那么此时会存在大量被打开的文件!所以,OS必须把文件管理起来,采用先描述、再组织。
文件描述符的本质是数组的下标
重定向:在操作系统内部更改
缓冲区
刷新策略:
1.立即刷新
2.行刷新(行缓冲)
3.满刷新(全缓冲)
特殊:1.用户强制,2.进程退出
stdout和stderr
10.19前一个小时
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/114130.html
如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!