简述文件描述符
- 在进程中每打开一个文件,都会创建有相应的文件描述信息struct file,这个描述信息被添加在pcb structfiles_struct中,以数组的形式进行管理,随即向用户返回数组的下标作为文件描述符,用于操作文件
如图所示:
0&1&2
-
Linux进程默认情况下会有3个缺省打开的文件描述符,分别是标准输入0(stdin), 标准输出1(stdout), 标准错误2(stderr).
-
0,1,2对应的物理设备一般是:键盘,显示器,显示器
先说结论:文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的最小的一个下标,作为新的文件描述符。
再看现象:
int fd1 = open("file1", O_RDONLY|O_CREAT);
if(fd1<0)
{
perror("open");
return 1;
}
printf("fd: %d\n", fd1);
int fd2 = open("file2", O_RDONLY|O_CREAT);
if(fd2<0)
{
perror("open");
return 1;
}
printf("fd: %d\n", fd2);
int fd3 = open("file3", O_RDONLY|O_CREAT);
if(fd3<0)
{
perror("open");
return 1;
}
printf("fd: %d\n", fd3);
close(fd1);
close(fd2);
close(fd3);
通过上面代码的验证,我们知道0,1,2已经默认打开,而之后文件会从3开始依次往后。
如果1关闭会怎么样?
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main()
{
close(0);
//close(2);
int fd = open("myfile", O_RDONLY);
if(fd < 0){
perror("open");
return 1;
}
printf("fd: %d\n", fd);
close(fd);
return 0;
}
发现是结果是: fd: 0 或者 fd 2 可见,文件描述符的分配规则:在files_struct数组当中,找到当前没有被使用的
最小的一个下标,作为新的文件描述符。