file中private_data,fileprivate_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