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