加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

当我遇到套接字代码时,我正在使用glibc,有人可以解释发生了什么

发布时间:2020-12-16 03:37:09 所属栏目:百科 来源:网络整理
导读:这是我正在浏览的来源: glibc source.我的具体问题来自于这个特定的功能集: socket library. 例如(大多数功能都是这样设置的)socket / bind.c的源代码是: 19 #include errno.h 20 #include sys/socket.h 21 22 /* Give the socket FD the local address A
这是我正在浏览的来源: glibc source.我的具体问题来自于这个特定的功能集: socket library.

例如(大多数功能都是这样设置的)socket / bind.c的源代码是:

19 #include <errno.h>
  20 #include <sys/socket.h>
  21 
  22 /* Give the socket FD the local address ADDR (which is LEN bytes long).  */
  23 int
  24 __bind (fd,addr,len)
  25      int fd;
  26      __CONST_SOCKADDR_ARG addr;
  27      socklen_t len;
  28 {
  29   __set_errno (ENOSYS);
  30   return -1;
  31 }
  32 
  33 weak_alias (__bind,bind)
  34 
  35 stub_warning (bind)
  36 #include <stub-tag.h>

我承认我没有花很多时间,但是实际功能的代码究竟在哪里呢?这是一个很好的范例吗?

解决方法

__bind函数是一个 stub:它是一个外部看起来像真实的东西(相同的原型)但不执行必要功能的函数.

weak_alias宏告诉链接器绑定是__bind的弱别名.也就是说,bind的定义是weak symbol.如果没有其他定义的一个名为bind的符号,这个定义就是如果有另一个(非弱)的绑定定义,那么那个非弱定义就会被定义,而弱定义被忽略.弱的别名是一个弱符号,是另一个符号的别名(而不是自己定义).如果使用弱别名,则stub_warning宏会导致链接器发出警告.

绑定的真正实现取决于Glibc的编译操作系统.在Hurd,它定义在sysdeps/mach/hurd/bind.c.在Linux上,bind是一个系统调用:在Glibc源中没有C代码,只有汇编代码. bind在sysdeps/unix/sysv/linux/bind.S中提供,它重用了sysdeps / unix / sysv / linux / ** / socket.S或ports / sysdeps / unix / sysv / linux / * / socket.S中的体系结构相关定义.这些定义都是底层系统调用周围的薄包装,注意将参数和返回值复制到正确的寄存器中.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读