中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux的file結構體和inode結構體怎么用

發布時間:2022-02-07 16:24:28 來源:億速云 閱讀:182 作者:iii 欄目:開發技術

本篇內容介紹了“Linux的file結構體和inode結構體怎么用”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

1. file 結構體

file 結構體代表一個打開的文件,系統中每個打開的文件在內核空間都有一個關聯的 struct file。

它由內核在打開文件時創建,并傳遞給在文件上進行操作的任何函數。在文件的所有實例都關閉后,內核釋放這個數據結構。

注:在內核和驅動源代碼中,struct file 的指針通常被命名為 file 或 filp(即 file pointer)。

struct file {
        union {
           struct llist_node         fu_llist;
           struct rcu_head          fu_rcuhead;
        } 
        f_u;
        struct path               f_path;
        struct inode              *f_inode;/* cached value */
        const struct file_operations      *f_op;/* 和文件關聯的操作 */
        /*
         * Protects f_ep_links, f_flags.
         * Must not be taken from IRQ context.
         */
        spinlock_t                f_lock;
        enum rw_hint              f_write_hint;
        atomic_long_t              f_count;
        unsigned int              f_flags;/* 文件標志,如O_RDONLY、O_NONBLOCK、O_SYNC */
        fmode_t                 f_mode;/* 文件讀/寫模式,FMODE_READ、FMODE_WRITE */
        struct mutex              f_pos_lock;
        loff_t                  f_pos;/* 當前讀寫位置 */
        struct fown_struct        f_owner;
        const struct cred        *f_cred;
        struct file_ra_state        f_ra;
        u64                f_version;

        #ifdef CONFIG_SECURITY
        void *f_security;
        #endif
        /* needed for tty driver, and maybe others */
        void *private_data; /* 文件私有數據 */
        #ifdef CONFIG_EPOLL
        /* Used by fs/eventpoll.c to link all the hooks to this file */
        struct list_head f_ep_links;
        struct list_head f_tfile_llink;
        #endif /* #ifdef CONFIG_EPOLL */
        struct address_space *f_mapping;
        errseq_t f_wb_err;
    }
    __randomize_layout
  __attribute__((aligned(4)));/* lest something weird decides that 2 is OK */
  
    struct file_handle {
      __u32 handle_bytes;
      int handle_type;
      /* file identifier */
      unsigned char f_handle[0];
    };

文件讀/寫模式 mode、標志 f_flags 都是設備驅動關心的內容,而私有數據指針 private_data 在設備驅動中被廣泛應用,大多被指向設備驅動自定義以用于描述設備的結構體。

2. inode 結構體

VFS inode 包含文件訪問權限、屬主、組、大小、生成時間、訪問時間、最后修改事件等信息。它是 Linux 管理文件系統的基本單位,也是文件系統連接任何子目錄、文件的橋梁,inode 結構體的定義如下:

struct inode {

        umode_t                        i_mode;

/* inode的權限 */

        unsigned short                i_opflags;

        kuid_t                        i_uid;

/* inode擁有者的id */

        kgid_t                        i_gid;

/* inode所屬的群組id */

        unsigned int                i_flags;

#ifdef CONFIG_FS_POSIX_ACL

        struct posix_acl        *i_acl;

        struct posix_acl        *i_default_acl;

#endif

        const struct inode_operations        *i_op;

        struct super_block        *i_sb;

        struct address_space        *i_mapping;

#ifdef CONFIG_SECURITY

        void                        *i_security;

#endif

        /* Stat data, not accessed from path walking */

        unsigned long                i_ino;

        /*

         * Filesystems may only read i_nlink directly.  They shall use the

         * following functions for modification:

         *

         *    (set|clear|inc|drop)_nlink

         *    inode_(inc|dec)_link_count

         */

        union {

                const unsigned int i_nlink;

                unsigned int __i_nlink;

        };

        dev_t                        i_rdev;

/* 若是設備文件,此字段將記錄設備的設備號 */

        loff_t                        i_size;

/* inode所代表的文件大小 */

        struct timespec                i_atime;

/* inode最近一次的存取時間 */

        struct timespec                i_mtime;

/* inode最近一次的修改時間 */

        struct timespec                i_ctime;

/* inode的產生時間 */

        spinlock_t                i_lock;

/* i_blocks, i_bytes, maybe i_size */

        unsigned short          i_bytes;

        unsigned int                i_blkbits;

        enum rw_hint                i_write_hint;

        blkcnt_t                i_blocks;

/* inode所使用的block數,一個block為512字節 */

#ifdef __NEED_I_SIZE_ORDERED

        seqcount_t                i_size_seqcount;

#endif

        /* Misc */

        unsigned long                i_state;

        struct rw_semaphore        i_rwsem;

        unsigned long                dirtied_when;

/* jiffies of first dirtying */

        unsigned long                dirtied_time_when;

        struct hlist_node        i_hash;

        struct list_head        i_io_list;

/* backing dev IO list */

#ifdef CONFIG_CGROUP_WRITEBACK

        struct bdi_writeback        *i_wb;

/* the associated cgroup wb */

        /* foreign inode detection, see wbc_detach_inode() */

        int                        i_wb_frn_winner;

        u16                        i_wb_frn_avg_time;

        u16                        i_wb_frn_history;

#endif

        struct list_head        i_lru;

/* inode LRU list */

        struct list_head        i_sb_list;

        struct list_head        i_wb_list; 

/* backing dev writeback list */

        union {

                struct hlist_head        i_dentry;

                struct rcu_head                i_rcu;

        };

        u64                        i_version;

        atomic_t                i_count;

        atomic_t                i_dio_count;

        atomic_t                i_writecount;

#ifdef CONFIG_IMA

        atomic_t                i_readcount;

/* struct files open RO */

#endif

        const struct file_operations        *i_fop;

/* former ->i_op->default_file_ops */

        struct file_lock_context        *i_flctx;

        struct address_space        i_data;

        struct list_head        i_devices;

        union {

                struct pipe_inode_info        *i_pipe;

                struct block_device        *i_bdev;

/* 若是塊設備,為其對應的block_device結構體指針 */

                struct cdev                *i_cdev;

/* 若是字符設備,為其對應的cdev結構體指針 */

                char                        *i_link;

                unsigned                i_dir_seq;

        };

        __u32                        i_generation;

#ifdef CONFIG_FSNOTIFY

        __u32                        i_fsnotify_mask;

/* all events this inode cares about */

        struct fsnotify_mark_connector __rcu        *i_fsnotify_marks;

#endif

#if IS_ENABLED(CONFIG_FS_ENCRYPTION)

        struct fscrypt_info        *i_crypt_info;

#endif

        void                        *i_private;

/* fs or device private pointer */


} __randomize_layout;

“Linux的file結構體和inode結構體怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

行唐县| 繁峙县| 甘洛县| 永泰县| 太仓市| 霍州市| 扶绥县| 会同县| 麦盖提县| 邓州市| 苍南县| 务川| 泰兴市| 安康市| 宝应县| 连平县| 锦屏县| 长白| 辽源市| 辽宁省| 开封市| 广东省| 镇安县| 长治市| 资讯| 长岛县| 鹤壁市| 嘉黎县| 六盘水市| 延安市| 宁强县| 获嘉县| 诸暨市| 晋城| 建水县| 布拖县| 青田县| 澄城县| 江北区| 崇信县| 阿城市|