一、什么是文件描述符
在Linux上一切皆文件,文件描述符是内核为了高效的管理已经被打开的文件所创建的索引,它是一个非负整数,用于指代被打开的文件,所有执行的I/O操作的系统调用都是文件描述符完成的。
在Linux中,进程是通过文件描述符来访问文件的,文件描述符实际上是一个整数,程序启动时默认有三个文件描述符,分别是:
0 stdin 标准输入
1 stdout 标准输出
2 stderr 标准错误
3 `````` ``````` 标准规定,每次打开的文件时必须使用当前进程中最小可用的文件描述符号码。
二、如何创建文件描述符
进程获取文件描述符最常见的方法:open() 或create获取,或者从父进程继承
文件描述符对于每一个进程而言是唯一的,每一个进程都有一张文件描述符表;
从父进程继承,父进程打开的文件fork后,子进程通过其文件描述符也可以访问;
三、描述符对于服务器有什么作用
Linux上一切皆文件,与服务器联系起来主要是套接字文件描述符,每建立一个连接都需要与一个文件描述符关联起来,对数据的收发都依靠文件描述符来完成,通常服务器和客户端建立多少个连接就需要多少个文件描述符,所以简单讲,描述符的数据间接的决定了服务器能连接多少个客户端程序。
四、一个进程最大能打开多少个文件描述符,及用户级限制和系统级限制
一个进程最大能打开1024个文件描述符,但这个值可修改。
用户级限制:内核为了不让某一个进程消耗掉所有的文件资源,会对单个进程打开文件数做默认处理。
命令: ulimit -n可以查看当前用户级限制下进程能打开的文件最大的个数。
临时性修改: ulimit -SHn文件数可以修改用户级限制。
永久性修改:就必须修改/etc/ security/limits.conf配置文件。
在文件里面添加:hard nofile 文件数
soft nofile 文件数
然后保存退出重新登录,就可以。
系统级限制: 由于文件描述符是系统的一个重要资源,所以在实际过程中内核会对打开文件数做一个限制。
命令: sysctl -a | grep fs.file-max可以查看当前的系统级限制能够打开的最大文件数。
临时性修改:通过sysctl -w fs.file-max=文件数命令修改。
永久性修改:需要在/etc/sysctl.conf中添加fs.file-max=文件数退出后并保存,使用sysctl -p命令使其生效。
五、文件描述符和文件指针的联系与区别
文件指针: C语言中使用文件指针做为I/0的句柄。文件指针指向进程用户区中的一个被称为FILE结构的数据结构。FILE结构包括缓冲区和文件描述符。而文件描述符是文件描述符表的一一个索引,也就是说c语言的文件指针是Linux系统中对文件描述符的一种封装。