• file中private_data


    这个是Linux下连接VFS文件系统框架和不同文件/文件系统底层实现之间的一个核心数据结构,虽然它只是一个指针,但是一个指针可以解决所有问题,有了它,妈妈再也不用担心我的学习。我们回想一下用户态线程的创建结构,函数的入口同样是一个void*指针,而千言万语汇成一根指针,诗可以兴、可以观、可以群、可以怨,可以解决所有问题。因为file是VFS框架的一个基本概念,它要支持文件操作结构,例如open/read/write/release之类的接口,甚至还有poll等,只有有了这些结构,它们才能被纳入VFS这个大家庭。但是对于不同的设备文件来说,它们只是披着文件外衣的设备,所以他要有自己特有的结构来和设备交流,而这private_data就是这个连接的纽带。这样说可能还是比较抽象,最后是多看一些代码感受可能会深一些。
    下面是之前我遇到过的一些使用private_data的一些文件:


    1、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;


    2、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;

    3、套接口文件

    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;


    4、epoll文件

    static int ep_eventpoll_close(struct inode *inode, struct file *file)
    {
        struct eventpoll *ep = file->private_data;


    5、shm文件

    long do_shmat(int shmid, char __user *shmaddr, int shmflg, ulong *raddr)
    {
    ……
        file->private_data = sfd

  • 相关阅读:
    开源牛人 zcbenz
    分享一个快速的Json(反)序列化开源项目 Jil
    影响当今世界发展的重要技术难题
    余额表的处理方法
    使用TypeScript开发程序
    docker 和 nginx 配合的一个坑
    Excel 的一些使用记录
    mysql 用户授权相关
    容器数量增加导致 fs.inotify.max_user_instances 超过限制
    在 EF Core 中如何输出 linq 转换后的 sql 语句
  • 原文地址:https://www.cnblogs.com/linhaostudy/p/7825751.html
Copyright © 2020-2023  润新知