Linux内核中的文件描述符(二)——socket和文件描述符

发表于:2013-1-14 10:26

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:ce123    来源:51Testing软件测试网采编

  下面我们再来看看sock_map_fd函数

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();//分配一个未使用的fd
 if (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
};

相关链接:

Linux内核中的文件描述符(一)——基础知识简介

44/4<1234
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号