文件描述符
每个进程在Linux内核中都有一个进程控制块结构体(task_struct),task_struct 中有一个指针 struct files_struct *files 指向文件描述符表(一个数组),这个表中的每一个元素指向一个已经打开的文件指针(struct file)。
struct files_struct
{
atomic_t count; //引用计数 累加
struct fdtable *fdt;
struct fdtable fdtab;
spinlock_t file_lock ____cacheline_aligned_in_smp;
int next_fd;
struct embedded_fd_set close_on_exec_init;
struct embedded_fd_set open_fds_init;
struct file * fd_array[NR_OPEN_DEFAULT]; //文件描述符数组
};
struct file
{
mode_t f_mode; //表示文件是否可读或可写,FMODE_READ或FMODE_WRITE
dev_ t f_rdev ; // 用于/dev/tty
off_t f_ops; //当前文件位移
unsigned short f_flags; //文件标志,O_RDONLY,O_NONBLOCK和O_SYNC
unsigned short f_count; //打开的文件数目
unsigned short f_reada;
struct inode *f_inode; //指向inode的结构指针
struct file_operations *f_op; //文件操作索引指针
}
用户程序不能直接访问内核中的文件描述符表,而只能使用文件描述符表的索引(即0、1、2等数字),这些索引被称为文件描述符。
APP打开文件时,内核会从文件描述符表中挑选一个最小的未被使用的数字返回。
0、1、2 这三个文件描述符当进程被创建时,就被系统所占用了。(0、1、2:标准输入、标准输出、标准错误)