1.文件描述符
我们学习open的时候,就知道open成功的返回值是一个文件描述符。同时它也是一个小整数。
文件描述符是一个数字;一个数字是如何描述文件的呢?
一个进程要对所有的打开的文件进行管理,先将文件描述起来,然后组织进行管理,进程中对文件进行描述的结构体叫file(struct files),进程使用了一个结构体数组来组织这些描述,而文件描述符就是这个结构体数组的下标。
Linux进程默认情况下会有三个缺省打开的文件描述符,分别是标准输入0、标准输出1、标准错误2。
看代码:
int main()
{
int fd = -1;
fd = open("./tmp.txt",O_RDWR|CREAT);
if (fd < 0)
{
perror("open error");
return -1;
}
printf("fd=[%d]\n", fd);
fflush(stdout);
close(fd);
return 0;
}
我们编译,运行发现fd=3;
当我们关闭0/2时
int main()
{
int fd = -1;
close(0);
//close(2);
fd = open("./tmp.txt",O_RDWR|CREAT);
if (fd < 0)
{
perror("open error");
return -1;
}
printf("fd=[%d]\n", fd);
fflush(stdout);
close(fd);
return 0;
}
得到的结果就是fd=0(2);
所以文件描述符的分配规则是:寻找最小的未使用的下标(最小未使用分配原则)。
重定向
当我们关闭1,编译,运行后发现,什么也没有出现当我们打开所对应的文件的时候,发现fd=1被写入到tmp.txt文件当中,
当我们close(1)后,标准输出就关闭了,所以输出的内容都被重定向到3号文件描述符对应的file*,而3号file*正是我们open的,所以就被写入到tmp.txt中了,不会再写到标准输出中取。