ps:文件描述符表,与文件指针 有什么联系???
1.
linux 系统,一般一个进程 允许打开的最大文件数量是 1024, 对应内核区的进程控制块(pcb)中的文件描述符表的范围,
在shell输入 ulimit -a 就可以查看 open files 为1024。
在Linux系统中一切皆文件。如果要对某个设备进行操作,打开此设备文件,只要你打开文件就会获得该文件的文件描述符fd(file discriptor),这个文件描述符就是一个整数。
文件描述符就是这个文件描述符表的索引,文件描述符从0开始到1023;
2.
文件描述符的分配规律:从当前未使用的最小的整数处开始分配 。比如说如果你打开一个文件系统会自动为它打开三个文件,分别是stdin,stdout,stderr,就是标准输入,标准输出,标准输出。他们的文件描述符分别是 0,1,2,也就是说当你的文件打开时它的文件描述符就从3开始分配了,如果你把那三个文件关闭一个,例如,关掉标准输入,则打开的文件的文件描述符将会填上0,让后再往后分配。
3.
每个进程在PCB(Process Control Block)即进程控制块中都保存着一份文件描述符表,文件描述符就是这个表的索引,文件描述表中每个表项都有一个指向已打开文件的指针。已打开的文件在内核中用file结构体表示,文件描述符表中的指针指向file结构体。
fd为打开文件的文件描述符,而每个进程都有一张文件描述表,fd文件描述符就是这张表的索引,同样这张表中有一表项,该表项又是指向前面提到打开文件的file结构体,file结构体才是内核中用于描述文件属性的结构体
这段代码,能输出一个进程能打开多少文件
int main() {int num = 0;int fd;while(1) {fd = open("1.txt", O_RDONLY|O_CREAT|O_TRUNC, 0777);if(fd<0) {break;}num++;printf("%d\n", fd);}printf("---\n");printf("%d\n", num);perror("1.txt");return 0;
}
参考:
https://blog.csdn.net/chan0311/article/details/72793411
下面这个链接的文章写的非常好
https://blog.csdn.net/qq_28114615/article/details/94590598