i节点(inode)和文件描述符(file descriptor)的区别和联系
http://blog.csdn.net/wangchaoxjtuse/article/details/6036816
inode 或i节点是指对文件的索引。如一个系统,所有文件是放在磁盘或flash上,就要编个目录来说明每个文件在什么地方,有什么属性,及大小等。就像书本的目录一样,便于查找和管理。这目录是操作系统需要的,用来找文件或叫管理文件。许多操作系统都用到这个概念,如linux, 某些嵌入式文件系统等。当然,对某个系统来说,有许多i节点。所以对i节点本身也是要进行管理的。
在linux中,内核通过inode来找到每个文件,但一个文件可以被许多用户同时打开或一个用户同时打开多次。这就有一个问题,如何管理文件的当前位移量,因为可能每个用户打开文件后进行的操作都不一样,这样文件位移量也不同,当然还有其他的一些问题。所以linux又搞了一个文件描述符(file descriptor)这个东西,来分别为每一个用户服务。每个用户每次打开一个文件,就产生一个文件描述符,多次打开就产生多个文件描述符,一一对应,不管是同一个用户,还是多个用户。该文件描述符就记录了当前打开的文件的偏移量等数据。所以一个i节点可以有0个或多个文件描述符。多个文件描述符可以对应一个i节点。
- struct inode {
- struct list_headi_hash;
- struct list_headi_list;
- struct list_headi_dentry;
- struct list_headi_dirty_buffers;
- unsigned longi_ino; /*每一个inode都有一个序号,经由super block结构和其序号,我们可以很轻易的找到这个inode。*/
- atomic_t i_count; /*在Kernel里,很多的结构都会记录其reference count,以确保如果某个结构正在使用,它不会被不小心释放掉,i_count就是其reference count。*/
- kdev_t i_dev; /* inode所在的device代码 */
- umode_t i_mode; /* inode的权限 */
- nlink_t i_nlink; /* hard link的个数 */
- uid_t i_uid; /* inode拥有者的id */
- gid_t i_gid; /* inode所属的群组id */
- kdev_t i_rdev; /* 如果inode代表的是device的话,那此字段将记录device的代码 */
- off_t i_size; /* inode所代表的档案大小 */
- time_t i_atime; /* inode最近一次的存取时间 */
- time_t i_mtime; /* inode最近一次的修改时间 */
- time_t i_ctime; /* inode的产生时间 */
- unsigned long i_blksize; /* inode在做IO时的区块大小 */
- unsigned long i_blocks; /* inode所使用的block数,一个block为512 byte*/
- unsigned long i_version; /* 版本号码 */
- unsigned short i_bytes;
- struct semaphore i_sem;
- struct rw_semaphore i_truncate_sem;
- struct semaphore i_zombie;
- struct inode_operations *i_op;
- struct file_operations *i_fop;/* former ->i_op->default_file_ops */
- struct super_block *i_sb; /* inode所属档案系统的super block */
- wait_queue_head_t i_wait;
- struct file_lock *i_flock; /* 用来做file lock */
- struct address_space *i_mapping;
- struct address_space i_data;
- struct dquot *i_dquot [MAXQUOTAS];
- /* These three should probably be a union */
- struct pipe_inode_info *i_pipe;
- struct block_device *i_bdev;
- struct char_device *i_cdev;
- unsigned longi_dnotify_mask; /* Directory notify events */
- struct dnotify_struct *i_dnotify; /* for directory notifications */
- unsigned long i_state; /* inode目前的状态,可以是I_DIRTY,I_LOCK和 I_FREEING的OR组合 */
- unsigned int i_flags; /* 记录此inode的参数 */
- unsigned char i_sock; /* 用来记录此inode是否为socket */
- atomic_t i_write count;
- unsigned int i_attr_flags; /* 用来记录此inode的属性参数 */
- __u32 i_generation;
- union {
- struct minix_inode_info minix_i;
- struct ext2_inode_info ext2_i;
- struct ext3_inode_info ext3_i;
- struct hpfs_inode_info hpfs_i;
- struct ntfs_inode_info ntfs_i;
- struct msdos_inode_info msdos_i;
- struct umsdos_inode_info umsdos_i;
- struct iso_inode_info isofs_i;
- struct sysv_inode_info sysv_i;
- struct affs_inode_info affs_i;
- struct ufs_inode_info ufs_i;
- struct efs_inode_info efs_i;
- struct romfs_inode_info romfs_i;
- struct shmem_inode_info shmem_i;
- struct coda_inode_info coda_i;
- struct smb_inode_info smbfs_i;
- struct hfs_inode_info hfs_i;
- struct adfs_inode_info adfs_i;
- struct qnx4_inode_info qnx4_i;
- struct reiserfs_inode_info reiserfs_i;
- struct bfs_inode_info bfs_i;
- struct udf_inode_info udf_i;
- struct ncp_inode_info ncpfs_i;
- struct proc_inode_info proc_i;
- struct socketsocket_i;
- struct usbdev_inode_info usbdev_i;
- struct jffs2_inode_infojffs2_i;
- void *generic_ip;
- } u;
- };
i节点(inode)和文件描述符(file descriptor)的区别和联系相关推荐
- 文件描述符file descriptor与inode的相关知识
每个进程在Linux内核中都有一个task_struct结构体来维护进程相关的 信息,称为进程描述符(Process Descriptor),而在操作系统理论中称为进程控制块 (PCB,Process ...
- linux文件 i节点结构,Linux 文件描述符 文件表项 i节点结构
Linux的VFS(虚拟文件系统)学习起来很痛苦,看源码不太明智,看完分析完就忘且太浪费时间,懂了后也无法应用在实际场合中.所以这里只是讨论下文件描述符,文件表项(file结构体)和inode,理清实 ...
- linux c fopen open 互相转换 文件指针 到 文件描述符 FILE* 转 FD
FILE*--fileno()--->fd; 实例如下: #include <stdio.h>int main() {FILE *fp = NULL;int i = 0;fp = f ...
- 文件句柄(file handles) 文件描述符(file descriptors)
欢迎支持笔者新作:<深入理解Kafka:核心设计与实践原理>和<RabbitMQ实战指南>,同时欢迎关注笔者的微信公众号:朱小厮的博客. 欢迎跳转到本文的原文链接:https: ...
- 文件句柄?文件描述符?傻傻分不清楚
概述 在实际工作中会经常遇到一些bug,有些就需要用到文件句柄,文件描述符等概念,比如报错: too many open files, 如果你对相关知识一无所知,那么debug起来将会异常痛苦.在li ...
- Linux网络编程--文件描述符
文件描述符 在Unix和Unix-like操作系统中,文件描述符(file descriptor, FD)是一个文件或者像pipe或者network socket等之类的输入/输出源的唯一标识. 文件 ...
- 深入理解Linux/Unix文件描述符和epoll
Linux/Unix 文件描述符(File Describer)的本质 Linux/Unix(以下简称Linux)系统中,每个进程都有一个专用的数组,数组的元素是一个结构体,称为文件描述符File D ...
- linux文件描述符 0 1 2,文件描述符
内核(kernel)利用文件描述符(file descriptor)来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定待读写的文件 ...
- Linux中对文件描述符的操作(FD_ZERO、FD_SET、FD_CLR、FD_ISSET
在Linux中,内核利用文件描述符(File Descriptor)即文件句柄,来访问文件.文件描述符是非负整数.打开现存文件或新建文件时,内核会返回一个文件描述符.读写文件也需要使用文件描述符来指定 ...
最新文章
- 如何用python开发游戏_手把手教你用Python完成一个控制台小游戏-阿里云开发者社区...
- 会java学scala多久_Scala中超时的未来
- 关于微信小程序swiper的问题
- EntityFramework进阶——数据编辑与维护
- oracle存储一个数字格式,Oracle根本数据类型存储格式研究(二)—数字类型
- Linux makefile教程之函数七[转]
- Head First 设计模式 —— 单例模式(Singleton)
- python小trick持续更新~
- 编译U-boot时,make[1]: *** 没有规则可以创建mkimage.o”
- 16进制颜色码转化rgba
- Android系统启动过程-uBoot+Kernel+Android
- php总结与展望_2018年的总结划下句号,展望2019
- UVALive 6922 Reverse Polish Notation
- 上海某大型企业因盗版Catia被罚千万
- SQLite 命令行客户端 sqlite3 使用指南
- 计算机速录方法,速录练习技巧方法介绍
- html js中间显示悬浮窗,Js 悬浮窗口(可固定位置)代码
- 程序编写——四步制作漫画线稿出书
- dis反汇编文件的分析理解
- BPM常见流程案例:会签流程、或签流程、分支流程、并行流程