文件描述符是什么?
1.文件描述符是一个整数
Linux进程默认情况下会有3个缺省打开的文件描述符分别是:
标准输入stdin(0)
标准输出stdout(1)
标准错误(2)
2.文件描述符是从0开始的整数
怎样得到文件描述符?
当open打开某文件时,如果打开成功,此时的返回值就是此文件的描述符
文件描述符的详解
每个进程都有一个指针*files,指向一张表files_struct,该表最重要的部分是包含了一个指针数组,每个元素都是一个指向打开文件的指针
本质上,文件描述符是files_struct表中数组的下标,故拿着文件描述符可以找到对应的文件
当我们打开文件时,操作系统内存中会新创建相应的数据结构来描述目标文件,于是就有了file结构体,表示一个已经打开的文件对象,而进程执行open系统调用,所以必须让进程和文件相关联起来,
文件描述符的分配规则
在files_struct数组当中,找到当前没有被使用的而且是最小的一个下标,作为新的文件描述符
示例
1.
代码:
#include<stdio.h>
#include<stdlib.h>
#include<fcntl.h>
#include<unistd.h>
int main()
{
int fd1=open("myfile",O_RDONLY);
int fd2=open("file",O_WRONLY|O_CREAT,0644);
if(fd1<0||fd2<0)
{
perror("open");
exit(1);
}
printf("fd1=%d,fd2=%d\n",fd1,fd2);
close(fd1);
close(fd2);
return 0;
}
运行结果:
linux进程默认情况下会打开三个文件:标准输出、标准输入、标准错误,这三个文件的描述符分别是0、1、2,如果再打开文件的话,文件的描述符就会依次递增
2.
代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
close(0);
int fd1=open("myfile",O_RDONLY);
int fd2=open("file",O_RDONLY|O_CREAT,0644);
if(fd1<0||fd2<0)
{
perror("open");
exit(1);
}
printf("fd1=%d,fd2=%d\n",fd1,fd2);
close(fd1);
close(fd2);
return 0;
}
运行结果:
如果某个文件被关闭,本来标记它的描述符就会被系统回收,打开新文件的话,系统会给新文件一个描述符,此描述符就是没有被使用的而且是最小的,后面再打开文件的话,文件描述符的分配规则同理
3.
代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
close(2);
int fd1=open("myfile",O_RDONLY);
int fd2=open("file",O_RDONLY);
if(fd1<0||fd2<0)
{
perror("open");
exit(1);
}
printf("fd1=%d,fd2=%d\n",fd1,fd2);
close(fd1);
close(fd2);
return 0;
}
运行结果:
4.
代码:
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<fcntl.h>
int main()
{
close(0);
close(2);
int fd1=open("myfile",O_RDONLY);
int fd2=open("file",O_RDONLY);
if(fd1<0||fd2<0)
{
perror("open");
exit(1);
}
printf("fd1=%d,fd2=%d\n",fd1,fd2);
close(fd1);
close(fd2);
return 0;
}
运行结果:
故文件描述符的分配规则是
在files_struct中找到当前最小的没有被使用的作为文件的描述符