linux内核中的文件描述符(二)--socket和文件描述符
linux内核中的文件描述符(二)--socket和文件描述符
Kernel version:2.6.14
CPU architecture:ARM920T
Author:ce123(http://blog.csdn.net/ce123)
socket和文件系统紧密相关,我们可以通过文件系统的open、read、write和close等操作socket。下面是一个简单的例子。
下面通过来具体分析一下。sys_socket是socket相关函数的总入口。
int sock_map_fd(struct socket *sock){int fd;struct qstr this;char name[32];/* *Find a file descriptor suitable for return to the user. */fd = get_unused_fd();//分配一个未使用的fdif (fd >= 0) {struct file *file = get_empty_filp();if (!file) {put_unused_fd(fd);fd = -ENFILE;goto out;}this.len = sprintf(name, "[%lu]", SOCK_INODE(sock)->i_ino);this.name = name;this.hash = SOCK_INODE(sock)->i_ino;file->f_dentry = d_alloc(sock_mnt->mnt_sb->s_root, &this);if (!file->f_dentry) {put_filp(file);put_unused_fd(fd);fd = -ENOMEM;goto out;}file->f_dentry->d_op = &sockfs_dentry_operations;d_add(file->f_dentry, SOCK_INODE(sock));file->f_vfsmnt = mntget(sock_mnt);file->f_mapping = file->f_dentry->d_inode->i_mapping;sock->file = file;//建立联系file->f_op = SOCK_INODE(sock)->i_fop = &socket_file_ops;//socket操作函数,当使用文件系统的IO函数时,其实使用的是socket的IO函数file->f_mode = FMODE_READ | FMODE_WRITE;file->f_flags = O_RDWR;file->f_pos = 0;file->private_data = sock;fd_install(fd, file);}out:return fd;}static struct file_operations socket_file_ops = {.owner =THIS_MODULE,.llseek =no_llseek,.aio_read =sock_aio_read,.aio_write =sock_aio_write,.poll =sock_poll,.unlocked_ioctl = sock_ioctl,.mmap =sock_mmap,.open =sock_no_open,/* special open code to disallow open via /proc */.release =sock_close,.fasync =sock_fasync,.readv =sock_readv,.writev =sock_writev,.sendpage =sock_sendpage};