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指针