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对象关系图如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/2d2ea2c0913e7e08fc0acdaf1cc96f9d.png)
fd为file*数组的索引而不是成员字段;vfsmount与初始化之VFS对象关系图中的vfsmount是同一个对象,即sock_mnt;对于伪文件系统,操作索引对象没有意义,所以inode的i_op为空(未画出)。
引言
在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对象关系图如下
![](https://oscdn.geek-share.com/Uploads/Images/Content/201908/31/2d2ea2c0913e7e08fc0acdaf1cc96f9d.png)
fd为file*数组的索引而不是成员字段;vfsmount与初始化之VFS对象关系图中的vfsmount是同一个对象,即sock_mnt;对于伪文件系统,操作索引对象没有意义,所以inode的i_op为空(未画出)。
相关文章推荐
- 创建Linux虚拟文件系统 (2012-02-07 10:59)
- Linux虚拟文件系统(内核初始化<一>)
- Linux虚拟文件系统(内核初始化<二>)
- Linux套接字与虚拟文件系统(1):初始化和创建 http://www.cppblog.com/qinqing1984/archive/2015/05/03/210521.html
- Linux 创建文件系统及挂载文件系统流程详解
- Linux 创建文件系统及挂载文件系统流程详解
- Linux创建文件系统及挂载文件系统流程详解
- 创建虚拟文件系统
- VMware安装Linux,出现错误-未找到要在其中创建新文件系统
- linux创建文件时添加系统时间
- Linux 的虚拟文件系统(强烈推荐)
- Linux 创建文件系统及挂载文件系统流程详解
- Linux 创建文件系统及挂载文件系统详解一 推荐
- Linux 创建文件系统及挂载文件系统详解
- linux文件系统体系结构 和 虚拟文件系统(VFS)
- Linux 创建文件系统及挂载文件系统流程详解
- 从文件 I/O 看 Linux 的虚拟文件系统
- linux 创建临时文件系统、临时文件
- Linux 创建文件系统及挂载文件系统流程详解
- Linux 创建文件系统及挂载文件系统流程详解