什么是文件描述符
文件描述符(file descriptor)是一个非负整数,内核用其来标识一个特定进程正在访问的文件。
当内核打开(open)一个现有文件或者创建(create)一个新文件时,都会返回一个文件描述符,在读(read)、写(write)文件时就会使用这个文件描述符(将文件描述符作为参数传递给read、write函数)。
特殊文件描述符
shell给每个进程分配了3个固定文件描述符:0、1、2,并且一旦进程启动这3个文件描述符就处于打开状态。
0:shell把文件描述符0与进程的标准输入(键盘输入)关联
1:shell把文件描述符1与进程的标准输出(输出到屏幕)关联
2:shell把文件描述符2与进程的标准错误(也是输出到屏幕)关联
在POSIX系统中,幻数0、1、2已被标准化为符号常量:STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,因此编程的时候要使用标准化符号常量。这些常量在
/* Standard file descriptors. */
#define STDIN_FILENO 0 /* Standard input. */
#define STDOUT_FILENO 1 /* Standard output. */
#define STDERR_FILENO 2 /* Standard error output. */
文件描述符的上限
文件描述符的变化范围是0~OPEN_MAX-1。OPEN_MAX值可以通过系统调用函数sysconf类获取。
//man sysconf
OPEN_MAX - _SC_OPEN_MAX
The maximum number of files that a process can have open at any time. Must not be less than _POSIX_OPEN_MAX (20).
#include
#include
int main() {
printf("The open max:%ld\n", sysconf(_SC_OPEN_MAX));
return 0;
}
现在的操作系统,文件描述符的变化范围几乎是无限制的,它只受内存、整型字长以及配置的limit的约束。