您的位置:首页 > 运维架构 > Linux

Linux套接字与虚拟文件系统(1):初始化和创建

2017-06-13 16:39 309 查看
http://www.cppblog.com/qinqing1984/archive/2015/05/03/210521.html

引言
在Unix的世界里,万物皆文件,通过虚拟文件系统VFS,程序可以用标准的Unix系统调用对不同的文件系统,甚至不同介质上的文件系统进行读写操作。对于网络套接字socket也是如此,除了专属的Berkeley Sockets API,还支持一些标准的文件IO系统调用如read(v)、write(v)和close等。那么为什么socket也支持文件IO系统调用呢?在Linux上,这是通过套接口伪文件系统sockfs来实现的,因为sockfs实现了VFS中的4种主要对象:超级块super block、索引节点inode、目录项对象dentry和文件对象file,当执行文件IO系统调用时,VFS就将请求转发给sockfs,而sockfs就调用特定的协议实现,层次结构如下图:

[align=center]static int __init sock_init(void)
2static int sockfs_get_sb(struct file_system_type *fs_type,int flags, const char *dev_name, void *data,struct vfsmount *mnt)
2static struct socket *sock_alloc(void)
2static int sock_alloc_file(struct socket *sock, struct file **f, int flags)
2void fd_install(unsigned int fd, struct file *file)
2{
3 struct files_struct *files = current->files;
4 struct fdtable *fdt;
5 spin_lock(&files->file_lock);
6 fdt = files_fdtable(files);
7 BUG_ON(fdt->fd[fd] != NULL);
8 rcu_assign_pointer(fdt->fd[fd], file);
9 spin_unlock(&files->file_lock);
10}[/align]

fd和file分别为上一过程返回的空闲文件描述符和文件对象,使RCU技术来设置file到当前进程的fd数组中。

经过以上过程后,所创建的VFS对象关系图如下



fd为file*数组的索引而不是成员字段;vfsmount与初始化之VFS对象关系图中的vfsmount是同一个对象,即sock_mnt;对于伪文件系统,操作索引对象没有意义,所以inode的i_op为空(未画出)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: