首页 | Linux 基础 | 资讯动态 | Linux 应用 | Linux 服务器 | Linux 开发 | Linux 安全 | 专题 | 联盟论坛
  当前位置:主页>Linux 开发>linux 内核>文章内容
Linux 2.6.11内核文件IO系统调用详解
来源:www.unix5.com 作者:riechelr_hl 发布时间:2007-05-20  

1.引言

从事Linux环境工作2年有余,一直懵懵懂懂,1年前拜读了《莱昂氏UNIX源代码分析》一书,感觉自己的学习道路漫漫且修远。最近受chinaunix的精华文帖启发,拟把近来的部分内核调用分析笔记拿出来与各前辈先进共同探讨学习,以壮个人学习之路。

本部分主要讲述的是文件I/O操作的2.6.11内核版本实现,包括了主要的数据结构、宏定义和函数流程。以下分别讲述open,create,close,read,write,lseek系统调用。

2.主要参考

《莱昂氏UNIX源代码分析》

《UNIX环境高级编程》

www.kernel.org

3.主要数据结构

3.1.FD

对于内核而言,所有打开文件都由文件描述符引用。文件描述符是一个非负整数。当打开一个现存文件或创建一个新文件时,内核向进程返回一个文件描述符。

当读、写一个文件时,用open或creat返回的文件描述符标识该文件,把其作为参数传送给read或write。在POSIX.1应用程序中,文件描述符为常数0、1和2分别代表STDIN_FILENO、STDOUT_FILENO和STDERR_FILENO,意即标准输入,标准输出和标准出错输出,这些常数都定义在头文件;中。

文件描述符的范围是0~OPEN_MAX,在目前常用的linux系统中,是32位整形所能表示的整数,即65535,64位机上则更多。

3.2.File

 

struct file {
   struct list_head        f_list; //文件链表指针
  struct dentry                *f_dentry; // 文件对应的目录结构
  struct vfsmount         *f_vfsmnt; // 虚拟文件系统挂载点
  struct file_operations        *f_op; // 文件操作函数指针
  atomic_t                f_count; 
   unsigned int                 f_flags;
   mode_t                        f_mode; // 文件模式
  int                        f_error;
   loff_t                        f_pos; // 文件offset
   struct fown_struct        f_owner; //文件owner 结构
  unsigned int                f_uid, f_gid;
   struct file_ra_state        f_ra; // 跟踪上次文件操作状态的结构指针
  size_t                        f_maxcount; // 文件大小
  unsigned long                f_version;
   void                        *f_security; // hook 文件操作的security结构指针
  void                        *private_data; // tty 驱动器所需数据
#ifdef CONFIG_EPOLL
   struct list_head        f_ep_links; // EPOLL 机制检测所需链表结构
  spinlock_t                f_ep_lock; // 兼容早期gcc bug 的标志
#endif /* #ifdef CONFIG_EPOLL */
   struct address_space        *f_mapping; // 地址映射表
}

3.3.File_struct

File_struct结构保存了进程打开的所有文件表数据。

 

struct files_struct {
   atomic_t count; // 自动增量
  spinlock_t file_lock; // 低位成员保护标识
  int max_fds; // 最大文件句柄数目
  int max_fdset; // 最大的fd集合容量
  int next_fd; // 下一个空闲fd
   struct file ** fd; // 当前fd对应的文件结构指针列表
  fd_set *close_on_exec; // 可执行close的fd集合
  fd_set *open_fds; // 打开的fd集合
  fd_set close_on_exec_init; // 
   fd_set open_fds_init;
   struct file * fd_array[NR_OPEN_DEFAULT]; // 默认打开的fd队列
};


4.open 函数

4.1.原型与参数

int open(const char * pathname, int oflag, .../*, mode_t mode * / ) -1代表错误。

这里的oflag是一个整形,主要供open 函数使用,部分fcntl函数也会使用。详细的说明请用man 2 open就可以看到了。以下列出了2.6内核定义的open和fcntl函数所使用的flag宏定义,说明的格式如宏定义名称<实际常数值>;: 描述。

O_ACCMODE <0003>;: 读写文件操作时,用于取出flag的低2位。

O_RDONLY<00>;: 只读打开

O_WRONLY<01>;: 只写打开

O_RDWR<02>;: 读写打开

O_CREAT<0100>;: 文件不存在则创建,需要mode_t,not fcntl

O_EXCL<0200>;: 如果同时指定了O_CREAT,而文件已经存在,则出错, not fcntl

O_NOCTTY<0400>;: 如果pathname指终端设备,则不把此设备分配作为此进程的控制终端。not fcntl O_TRUNC<01000>;: 如果此文件存在,而且为只读或只写成功打开,则把其长度截短为0。not fcntl

共6页: 上一页 1 [2] [3] [4] [5] [6] 下一页
 
如果您对本文有任何疑问或者建议,请到论坛讨论区发表您的意见: >> 论坛入口
[收藏] [推荐] [评论(0条)] [返回顶部] [打印本页] [关闭窗口]  
  热点文章
·使用 Linux 系统调用的内核命令
·Linux操作系统的源代码目录树结
·Linux用户态与内核态的交互讲解
·Linux内核对I/O端口的管理实现(
·深入分析 Linux操作系统的内核链
·Linux内核可装载模块对设备驱动
·概述Linux系统的驱动框架及驱动
·详解Linux 2.6内核新文件系统变
·Linux系统可卸载内核模块完全指
·FreeBSD手册讲解(一)--配置FreeB
·编译Linux操作系统的内核讲解
·Linux系统可卸载内核模块完全指
  相关文章
·定制Linux内核 充分发挥系统的潜
·Linux内核模块和驱动程序的详细
·剖析Linux 2.6内核在嵌入式上的
·Linux操作系统内核启动参数详细
·详细解析Linux操作系统的内核空
·Linux内核可装载模块对设备驱动
·走向Linux系统高手之路 编译内核
·深入分析 Linux操作系统的内核链
·Linux内核入侵检测安全增强实现
·Linux内核入侵检测安全增强实现
·Linux操作系统的源代码目录树结
·使用 Linux 系统调用的内核命令

本站信息源至:互联网络,均为学习,交流所用,如有版权问题,请联系我们.
站长QQ:397422079 E_mail:riechelr_hl@unix5.com
转载本站内容请注明原作者名.谢谢!