微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > linux内核中的文件描述符(二)--socket和文件描述符

linux内核中的文件描述符(二)--socket和文件描述符

时间:11-22 来源:互联网 点击:

  1. dmsg(a0,(structmsghdr__user*)a1,a[2]);
  2. break;
  3. caseSYS_RECVMSG:
  4. err=sys_recvmsg(a0,(structmsghdr__user*)a1,a[2]);
  5. break;
  6. default:
  7. err=-EINVAL;
  8. break;
  9. }
  10. returnerr;
  11. }/*Itmaybealreadyanotherdescriptor8)Notkernelproblem.*/
  12. returnretval;
  13. out_release:
  14. sock_release(sock);
  15. returnretval;
  16. }

当应用程序使用socket()创建一个socket时,会执行sys_socket,其定义如下

[plain]view plaincopyprint?

  1. asmlinkagelongsys_socket(intfamily,inttype,intprotocol)
  2. {
  3. intretval;
  4. structsocket*sock;
  5. retval=sock_create(family,type,protocol,&sock);//创建socket
  6. if(retval<0)
  7. gotoout;
  8. retval=sock_map_fd(sock);//分配一个未使用的文件描述符fd,并将socket和fd建立联系
  9. if(retval<0)
  10. gotoout_release;
  11. out:
  12. /*Itmaybealreadyanotherdescriptor8)Notkernelproblem.*/
  13. returnretval;
  14. out_release:
  15. sock_release(sock);
  16. returnretval;
  17. }

结构体socket的定义如下(include\linux\net.h):

[plain]view plaincopyprint?

  1. structsocket{
  2. socket_statestate;
  3. unsignedlongflags;
  4. structproto_ops*ops;
  5. structfasync_struct*fasync_list;
  6. structfile*file;//通过这个和文件描述符建立联系
  7. structsock*sk;
  8. wait_queue_head_twait;
  9. shorttype;
  10. };

下面我们再来看看sock_map_fd函数

[plain]view plaincopyprint?

  1. intsock_map_fd(structsocket*sock)
  2. {
  3. intfd;
  4. structqstrthis;
  5. charname[32];
  6. /*
  7. *Findafiledescriptorsuitableforreturntotheuser.
  8. */
  9. fd=get_unused_fd();//分配一个未使用的fd
  10. if(fd>=0){
  11. structfile*file=get_empty_filp();
  12. if(!file){
  13. put_unused_fd(fd);
  14. fd=-ENFILE;
  15. gotoout;
  16. }
  17. this.len=sprintf(name,"[%lu]",SOCK_INODE(sock)->i_ino);
  18. this.name=name;
  19. this.hash=SOCK_INODE(sock)->i_ino;
  20. file->f_dentry=d_alloc(sock_mnt->mnt_sb->s_root,&this);
  21. if(!file->f_dentry){
  22. put_filp(file);
  23. put_unused_fd(fd);
  24. fd=-ENOMEM;
  25. gotoout;
  26. }
  27. file->f_dentry->d_op=&sockfs_dentry_operations;
  28. d_add(file->f_dentry,SOCK_INODE(sock));
  29. file->f_vfsmnt=mntget(sock_mnt);
  30. file->f_mapping=file->f_dentry->d_inode->i_mapping;
  31. sock->file=file;//建立联系
  32. file->f_op=SOCK_INODE(sock)->i_fop=&socket_file_ops;//socket操作函数,当使用文件系统的IO函数时,其实使用的是socket的IO函数
  33. file->f_mode=FMODE_READ|FMODE_WRITE;
  34. file->f_flags=O_RDWR;
  35. file->f_pos=0;
  36. file->private_data=sock;
  37. fd_install(fd,file);
  38. }
  39. out:
  40. returnfd;
  41. }
  42. staticstructfile_operationssocket_file_ops={
  43. .owner=THIS_MODULE,
  44. .llseek=no_llseek,
  45. .aio_read=sock_aio_read,
  46. .aio_write=sock_aio_write,
  47. .poll=sock_poll,
  48. .unlocked_ioctl=sock_ioctl,
  49. .mmap=sock_mmap,
  50. .open=sock_no_open,/*specialopencodetodisallowopenvia/proc*/
  51. .release=sock_close,
  52. .fasync=sock_fasync,
  53. .readv=sock_readv,
  54. .writev=sock_writev,
  55. .sendpage=sock_sendpage
  56. };


Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top