linux内核中的文件描述符(一)--基础知识简介
CPU architecture:ARM920T
Author:ce123(http://blog.csdn.net/ce123)
作为文件的使用者,进程理所当然的要将所使用的文件记录于自己的控制块中,也就是task_struct。另外,由于进程所对应的程序也是一个文件,因此进程控制块还必须记录这个文件的相关信息。由于OS要对所有进程提供服务,因此OS还要维护一个记录所有进程打开的文件的总表。
1.文件对象
当进程通过open系统调用打开一个文件时,该系统调用找到这个文件后,会把文件封装到一个file结构的实例中提供给进程,这个实例称为file对象。file结构的定义如下:
[plain]view plaincopyprint?
- structfile{
- structlist_headf_list;//所有打开文件的链表
- structdentry*f_dentry;//文件的dentry
- structvfsmount*f_vfsmnt;//文件目录的VFS安装点指针
- structfile_operations*f_op;//指向文件操作函数集的指针
- atomic_tf_count;//记录访问本文件的进程数目的计数器
- unsignedintf_flags;//访问类型
- mode_tf_mode;//访问模式
- loff_tf_pos;//文件当前的读写位置
- structfown_structf_owner;
- unsignedintf_uid,f_gid;//文件所有者ID和用户组ID
- structfile_ra_statef_ra;
- unsignedlongf_version;
- void*f_security;
- /*neededforttydriver,andmaybeothers*/
- void*private_data;
- #ifdefCONFIG_EPOLL
- /*Usedbyfs/eventpoll.ctolinkallthehookstothisfile*/
- structlist_headf_ep_links;
- spinlock_tf_ep_lock;
- #endif/*#ifdefCONFIG_EPOLL*/
- structaddress_space*f_mapping;
- structrcu_headf_rcuhead;
- };
结构中的域f_uid为文件所有者的ID,f_gid为文件所有者所在组的ID。这样就使得一个文件可能面临三种用户的访问:
- 文件所有者;
- 同组用户;
- 其他用户。
内核在处理一个进程或用户访问一个文件的请求时,要根据进程的f_uid和f_gid以及访问模式来确定该进程是否具有访问这个文件的权限。对于一个用户来说,可以有读、写和执行三种文件权限,这三种权限和三种用户就共有9中组合,即文件的访问权限可以用9个bit来表示,并将其保存在文件的dentry中。
结构中的域f_pos记录了进程对文件读写位置的当前值,可以通过调用函数llseek进程移动。
结构中的f_op执向结构file_operations,该结构封装了对文件进行操作的函数,定义如下:
[plain]view plaincopyprint?
- structfile_operations{
- structmodule*owner;
- loff_t(*llseek)(structfile*,loff_t,int);
- ssize_t(*read)(structfile*,char__user*,size_t,loff_t*);
- ssize_t(*aio_read)(structkiocb*,char__user*,size_t,loff_t);
- ssize_t(*write)(structfile*,constchar__user*,size_t,loff_t*);
- ssize_t(*aio_write)(structkiocb*,constchar__user*,size_t,loff_t);
- int(*readdir)(structfile*,void*,filldir_t);
- unsignedint(*poll)(structfile*,structpoll_table_struct*);
- int(*ioctl)(structinode*,structfile*,unsignedint,unsignedlong);
- long(*unlocked_ioctl)(structfile*,unsignedint,unsignedlong);
- long(*compat_ioctl)(structfile*,unsignedint,unsignedlong);
- int(*mmap)(structfile*,structvm_area_struct*);
- int(*open)(structinode*,structfile*);
- int(*flush)(structfile*);
- int(*release)(structinode*,structfile*);
- int(*fsync)(structfile*,structdentry*,intdatasync);
- int(*aio_fsync)(structkiocb*,intdatasync);
- int(*fasync)(int,structfile*,int);
- int(*lock)(structfile*,int,structfile_lock*);
- ssize_t(*readv)(structfile*,conststructiovec*,unsignedlong,loff_t*);
- ssize_t(*writev)(structfile*,conststructiovec*,unsignedlong,loff_t*);
- ssize_t(*sendfile)(structfile*,loff_t*,size_t,read_actor_t,void*);
- ssize_t(*sendpage)(structfile*,structpage*,int,size_t,loff_t*,int);
- unsignedlong(*get_unmapped_area)(structfile*,unsignedlong,unsignedlong,unsignedlong,unsignedlong);
- int(*check_flags)(int);
- int(*dir_notify)(structfile*filp,unsignedlongarg);
- int(*flock)(structfile*,int,structfile_lock*);
- };
2.文件描述符
下面进一步介绍进程对自己所访问的file对象的管理方法。linux中使用一个数组来管理进程打开的文件的file对象,数组中的每个元素都存放一个纸箱进程
linux内核文件描述符基础知 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)