file結構中的private_data

private_data是Linux下鏈接VFS文件系統框架和不一樣文件/文件系統底層實現之間的一個核心數據結構,雖然它只是一個指針,可是一個指針能夠解決全部問題node


因 爲file是VFS框架的一個基本概念,它要支持文件操做結構,例如open/read/write/release之類的接口,甚至還有poll等,只 有有了這些結構,它們才能被歸入VFS這個你們庭。可是對於不一樣的設備文件來講,它們只是披着文件外衣的設備,因此他要有本身特有的結構來和設備交流,而 這private_data就是這個鏈接的紐帶。這樣說可能仍是比較抽象,最後是多看一些代碼感覺可能會深一些。數據結構

實質就是把device設備的private_data指針指向了本身定義的結構體。增長可複用性。
框架

下面是一些使用private_data的文件:socket

一、tty設備
static ssize_t tty_read(struct file * file, char __user * buf, size_t count, 
            loff_t *ppos)
{
    int i;
    struct tty_struct * tty;
    struct inode *inode;
    struct tty_ldisc *ld;

    tty = (struct tty_struct *)file->private_data;
二、tun/tap設備
static ssize_t tun_chr_aio_read(struct kiocb *iocb, const struct iovec *iv,
                unsigned long count, loff_t pos)
{
    struct file *file = iocb->ki_filp;
    struct tun_struct *tun = file->private_data;
三、套接口文件
static ssize_t do_sock_read(struct msghdr *msg, struct kiocb *iocb,
        struct file *file, const struct iovec *iov,
        unsigned long nr_segs)
{
    struct socket *sock = file->private_data;
    size_t size = 0;
四、epoll文件
static int ep_eventpoll_close(struct inode *inode, struct file *file)
{
    struct eventpoll *ep = file->private_data;
五、shm文件
long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr)
{
……
    file->private_data = sfd;spa


Reference.net

[1].http://blog.csdn.net/ywh147/article/details/8684486指針

相關文章
相關標籤/搜索