這個是Linux下連接VFS文件系統框架和不同文件/文件系統底層實現之間的一個核心數據結構,雖然它只是一個指針,但是一個指針可以解決所有問題,有了它,媽媽再也不用擔心我的學習。我們回想一下用戶態線程的創建結構,函數的入口同樣是一個void*指針,而千言萬語彙成一根指針,詩可以興、可以觀、可以群、可以 ...
這個是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